【问题标题】:How do I return a StringWriter When I can't Clone it?无法克隆时如何返回 StringWriter?
【发布时间】:2011-02-23 01:40:05
【问题描述】:

我的代码如下所示。显然我不能写“Ok”,因为该对象已被处置。我不能返回 sw.Clone() 因为克隆不存在。如果我不使用 using 那么在 = new 和 return 之间的任何时候(比如迭代和写入对象,因为我的示例没有这样做)可能会出现异常,因此不会处理对象。

我是否要在 try 块之外定义 sw 并检查它是否为 null 然后在 catch 块中处理?这似乎有点过度的工作。有没有更好的办法?这是唯一的方法吗?

    static void func1()
    {
        using (var sw = func2())
        {
            sw.WriteLine("Ok");
        }
    }
    static StringWriter func2()
    {
        using (var sw = new StringWriter())
        {
            return sw;
        }
    }

【问题讨论】:

  • 你真正的 func2 是否写入 StringWriter?
  • 是的,func1也是如此
  • 我最终从父函数传入 sw 并在一个地方使用了一个 try 块(但这是一个 dif 对象,而不是字符串编写器)

标签: .net exception clone idisposable stringwriter


【解决方案1】:

您可能需要重新考虑返回 StringWriter。虽然您可能有几个地方需要额外的功能,但对我来说,感觉就像是在客厅中间竖起的管道。它不应该是公共 API 的一部分,即使在私有 API 中也有点笨拙。

话虽如此,如果您需要它,请不要在返回之前关闭或处置它,也不要使用 using 块。使用 try/catch 块(即:在 catch 中处理,而不是 finally 子句)。

【讨论】:

  • 我可能会选择这个,因为你是唯一一个说我应该考虑不返回 stringwriter/使用该功能的人。
【解决方案2】:

使用 func1 和 func2 方法创建一个类,将其设为 IDisposable,在构造函数中初始化一个 StringWriter,然后在您的类的 Dispose 方法中对其进行 Dispose。

这假设您正在以不止一种方法写入 StringWriter。

【讨论】:

    【解决方案3】:

    摆脱第二个 using 块。做吧

    StringWriter sw = new StringWriter();
    return sw;
    

    如果您在 using 块中定义 StringWriter,它会被释放。

    【讨论】:

    • 如果在new StringWriter 和return sw 之间抛出异常(例如,如果您在返回之前对 StringWriter 进行处理)则不起作用
    【解决方案4】:

    仅供参考:StringWriter's close calls the Dispose method 的实现传递一个真值。为什么不将第二个 sw 返回到调用方法并调用 close ,这将是等效的。

    【讨论】:

      【解决方案5】:

      我假设这是一个关于返回实现IDisposable 的对象的一般问题,而不是关于func1 和func2 的问题。

      如果你在任何实现IDisposable 的地方使用using 块

      1. 创建它并
      2. 当您的方法返回时不再需要它

      在您的情况下,您正在创建它,但在您的方法返回后它仍然需要存在。在这种情况下,不要在创建对象的方法中使用 using 块。然后调用者负责处理对象,我看到它已经这样做了。

      【讨论】:

      • 我要问的问题是代码分析警告我可能会导致我的对象不被处置之间的异常。假设我正在做最佳实践,我应该处理这个问题,但认为 try/catch 是矫枉过正的。也许我应该返回一个字符串
      • 请显示产生代码分析警告的确切代码,并显示警告。顺便说一句,如果你可以返回一个字符串,返回一个字符串。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 2020-05-17
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多