using
语句是否总是处置该对象,即使有一个返回或异常被抛入其中?即:
using (var myClassInstance = new MyClass())
{
// ...
return;
}
要么
using (var myClassInstance = new MyClass())
{
// ...
throw new UnexplainedAndAnnoyingException();
}
是的,这就是重点。它编译为:
SomeDisposableType obj = new SomeDisposableType();
try
{
// use obj
}
finally
{
if (obj != null)
((IDisposable)obj).Dispose();
}
这里要小心你的术语;对象本身未被释放。调用Dispose()
方法,通常释放非托管资源。
如果对象实现了IDisposable,则会调用它。
从MSDN使用Statement(C#Reference)
定义一个范围,在该范围之外将放置一个或多个对象。
using语句允许程序员指定何时使用资源的对象应该释放它们。提供给using语句的对象必须实现IDisposable接口。此接口提供Dispose方法,该方法应释放对象的资源。
不,不。
但这不是using
声明的错。这是因为CLR如何处理finally
块。在某些情况下,finally
块将无法执行。如果你有一个未处理的异常,并且如果CLR认为执行更多代码会导致更多错误,那么它将不执行Dispose
方法(因为它不会执行finally
方法被编译为Dispose
块)。因此,要非常小心,不要把你的生命投入到Dispose
方法的执行中。
可导致Dispose
方法未被执行的其他情况可列为:
OutOfMemoryException
and StackOverflowException