using
语句是否始终处置该对象,即使有返回或异常被抛出?即:
using (var myClassInstance = new MyClass())
{
// ...
return;
}
或
using (var myClassInstance = new MyClass())
{
// ...
throw new UnexplainedAndAnnoyingException();
}
答案 0 :(得分:32)
是的,这就是重点。它编译为:
SomeDisposableType obj = new SomeDisposableType();
try
{
// use obj
}
finally
{
if (obj != null)
((IDisposable)obj).Dispose();
}
这里要小心你的术语;对象本身未被释放。调用Dispose()
方法,通常会释放非托管资源。
答案 1 :(得分:10)
如果对象实现了IDisposable,则会调用它。
使用MSDN的声明(C#参考)
定义一个范围,一个或多个对象将在该范围之外 地布置。
using语句允许程序员指定对象的时间 使用资源应该释放它们。提供给使用的对象 语句必须实现IDisposable接口。这个界面 提供Dispose方法,该方法应该释放对象 资源。
答案 2 :(得分:4)
不,不是。
但这不是using
语句的 fault 。这是因为CLR如何处理finally
块。在某些情况下,finally
块将不会执行。如果您有未处理的异常,并且CLR 认为执行更多的代码会导致更多的错误,则它将不会执行Dispose
方法(因为它将不会执行finally
Dispose
方法被编译为..因此,请非常小心,不要将生命投入到执行Dispose
方法中。
其他可能导致Dispose
方法无法执行的情况可以列为:
OutOfMemoryException
和StackOverflowException
杀死进程
功率损耗