语句是否using
总是处理对象,即使其中有返回或抛出异常?IE:
using (var myClassInstance = new MyClass())
{
// ...
return;
}
或者
using (var myClassInstance = new MyClass())
{
// ...
throw new UnexplainedAndAnnoyingException();
}
语句是否using
总是处理对象,即使其中有返回或抛出异常?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()
方法,通常会释放非托管资源。
不,它没有。
但这不是陈述的错。using
这是因为finally
CLR 如何处理这些块。在某些情况下,finally
块不会执行。如果你有一个未处理的异常并且如果 CLR认为执行更多的代码会导致更多的错误,它不会执行Dispose
方法(因为它不会执行方法被编译到的finally
块......)。Dispose
因此,要非常小心,不要将生命投入到Dispose
方法的执行中。
其他可能导致Dispose
方法不被执行的情况可以列举如下:
OutOfMemoryException
和StackOverflowException
杀死进程
电力流失
如果对象实现了 IDisposable,它将被调用。
来自 MSDN 的 using Statement (C# Reference)
定义一个范围,一个或多个对象将被释放到该范围之外。
using 语句允许程序员指定使用资源的对象何时应该释放它们。提供给 using 语句的对象必须实现 IDisposable 接口。该接口提供了 Dispose 方法,该方法应该释放对象的资源。