我有以下代码:
public void Dispose()
{
bool append = true;
using(var log = new System.IO.StreamWriter("log.txt", append))
{
log.WriteLine("Disposing");
log.Flush();
}
}因此存在StreamWriter可能抛出异常的风险,这是否意味着我的对象不会被释放?简单地将其包装在Try/Catch中就能解决问题吗?
谢谢。
发布于 2012-06-29 00:32:26
这取决于你这样说是什么意思:
这是否意味着我的对象不会被释放?
您的对象已经调用了Dispose,否则它不会到达StreamWriter代码。Dispose调用可能还没有完成,但它不像是在对象上有一些神奇的标志,上面写着“已处置或未处置”。
请注意,处理与垃圾收集和终结在逻辑上是分开的:您的对象仍将以与正常方式相同的方式进行垃圾收集(当没有活动引用时),如果您有终结器(几乎肯定不是一个好主意),如果您没有抑制它,它仍然会被调用。
重要的是要理解,尽管C#在语言级别支持IDisposable,但它实际上并不关心它。它只是另一个接口,而Dispose只是另一个方法。
一般来说,抛出一个异常对Dispose来说不是一个好主意(就像一个对象作为清理现有失败操作的一部分被处理,你最终会丢失原来的异常),但它不会以某种方式从根本上损害CLR。
发布于 2012-06-29 00:33:26
所以StreamWriter可能会抛出异常的风险,这是否意味着我的对象不会被释放呢?简单地将其包装在Try/Catch中就能解决问题吗?
如果StreamWriter抛出异常,唯一副作用就是以下代码将不会执行。
log.WriteLine("Disposing");
log.Flush();Rest一切都会如预期的那样。StreamWriter也将得到适当的处理。(这就是using关键字的用途)
https://stackoverflow.com/questions/11248937
复制相似问题