0

我的代码如下所示。显然我不能写“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;
        }
    }
4

5 回答 5

1

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

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

于 2010-05-24T02:05:58.300 回答
0

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

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

于 2010-05-24T01:19:46.020 回答
0

摆脱第二个 using 块。做就是了

StringWriter sw = new StringWriter();
return sw;

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

于 2010-05-24T01:21:16.910 回答
0

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

于 2010-05-24T01:26:31.157 回答
0

我将假设这是关于返回实现的对象的一般问题IDisposable,而不是关于func1and的问题func2

如果您using 在任何实施中使用块IDisposable

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

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

于 2010-05-24T01:52:03.950 回答