“using”语句是否始终处置对象?
using
语句是否总是处理对象,即使有返回或exception被抛入其中? IE:
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
块将不会执行。 如果你有一个未处理的exception,并且如果CLR 认为执行更多代码会导致更多错误,那么它将不会执行Dispose
方法(因为它不会执行将Dispose
方法编译为…的finally
块)。 因此,要非常小心,不要把你的生命付诸于Dispose
方法的执行。
可能导致Dispose
方法未执行的其他情况可以列为:
-
Environment.FailFast
-
OutOfMemoryException
和StackOverflowException
-
杀死这个过程
-
电力流失