1

我有以下代码:

        public void Dispose()
        {
            bool append = true;
            using(var log = new System.IO.StreamWriter("log.txt", append))
            {
                log.WriteLine("Disposing");
                log.Flush();
            }
        }

所以存在 StreamWriter 可能引发异常的风险,这是否意味着我的对象不会被处置?只需将其包装在 Try/Catch 中就可以解决问题吗?

谢谢。

4

2 回答 2

3

这取决于您的意思:

那是否意味着我的对象不会被处置?

你的对象已经Dispose调用了它,否则它不会到达StreamWriter代码。那个Dispose调用可能还没有完成,但它不像一个对象上有一些神奇的标志,上面写着“已处置或未处置”。

请注意,处理在逻辑上与垃圾收集和终结是分开的:您的对象仍将像正常情况下一样有资格进行垃圾收集(当没有实时引用时)并且如果您有终结器(几乎肯定不是一个好主意)它如果你没有抑制它,它仍然会被调用。

重要的是要理解,尽管 C#IDisposable在语言级别支持,但 CLR并不关心它。它只是另一个接口,Dispose只是另一种方法。

一般来说,Dispose抛出异常是个坏主意(就好像一个对象作为清理现有失败操作的一部分而被丢弃,你最终会丢失原始异常),但它不会以某种方式从根本上损害 CLR。

于 2012-06-28T16:32:26.010 回答
0

所以存在 StreamWriter 可能引发异常的风险,这是否意味着我的对象不会被处置?只需将其包装在 Try/Catch 中就可以解决问题吗?

如果 StreamWriter 会抛出异常,唯一的副作用是后续不会执行。

 log.WriteLine("Disposing");
 log.Flush();

休息一切都会如预期的那样。StreamWriter 也将被正确处理。(这就是using关键字的目的)

于 2012-06-28T16:33:26.277 回答