我有以下代码:
public void Dispose()
{
bool append = true;
using(var log = new System.IO.StreamWriter("log.txt", append))
{
log.WriteLine("Disposing");
log.Flush();
}
}
因此存在StreamWriter可能抛出异常的风险,这是否意味着我的对象不会被处置?只需将其包装在Try / Catch中解决问题吗?
感谢。
答案 0 :(得分:3)
这取决于你的意思:
那意味着我的对象不会被处理掉吗?
您的对象已调用Dispose
,否则无法访问StreamWriter
代码。那个Dispose
调用可能没有完成,但它不像是一个物体上有一些神奇的旗帜,上面写着“处置或不处理”。
请注意,处理在逻辑上与垃圾收集和完成分开:您的对象将仍然有资格进行垃圾收集,方法与正常情况相同(没有实时引用时),如果您有终结者(几乎肯定不是一个好主意)如果你没有压制它,它仍会被调用。
重要的是要理解尽管C#在语言级别支持IDisposable
,但CLR 真的并不关心它。它只是另一个界面,Dispose
只是另一种方法。
一般来说,Dispose
抛出一个异常是个坏主意(好像一个对象是作为清理现有失败操作的一部分处理的,你最终会失去原来的异常)但是它不会从根本上解决以某种方式损害CLR。
答案 1 :(得分:0)
因此存在StreamWriter可能抛出异常的风险,这是否意味着我的对象不会被处置?只需将其包装在Try / Catch中解决问题吗?
如果StreamWriter会抛出异常,那么副作用就是不会执行以下操作。
log.WriteLine("Disposing");
log.Flush();
休息一切都会按预期进行。
StreamWriter也将正确处理。 (这是using
关键字)