“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

  • OutOfMemoryExceptionStackOverflowException

  • 杀死这个过程

  • 电力流失