Dispose中的StreamWriter

时间:2012-06-28 16:25:20

标签: c# dispose

我有以下代码:

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

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

感谢。

2 个答案:

答案 0 :(得分:3)

这取决于你的意思:

  

那意味着我的对象不会被处理掉吗?

您的对象已调用Dispose,否则无法访问StreamWriter代码。那个Dispose调用可能没有完成,但它不像是一个物体上有一些神奇的旗帜,上面写着“处置或不处理”。

请注意,处理在逻辑上与垃圾收集和完成分开:您的对象仍然有资格进行垃圾收集,方法与正常情况相同(没有实时引用时),如果您有终结者(几乎肯定不是一个好主意)如果你没有压制它,它仍会被调用。

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

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

答案 1 :(得分:0)

  

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

如果StreamWriter会抛出异常,那么副作用就是不会执行以下操作。

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

休息一切都会按预期进行。 StreamWriter也将正确处理。 (这是using关键字)

的目的