C# 是不是;使用;语句是否始终处置对象?
C# 是不是;使用;语句是否始终处置对象?,c#,dispose,using,using-statement,C#,Dispose,Using,Using Statement,using语句是否总是处理对象,即使其中有返回或抛出异常?即: using (var myClassInstance = new MyClass()) { // ... return; } 或 如果对象实现IDisposable,则将调用它 通过MSDN使用语句(C#参考) 定义一个范围,一个或多个对象将位于该范围之外 处置 using语句允许程序员指定 使用资源应该释放它们。提供给用户的对象 语句必须实现IDisposable接口。此接口 提供Dispose方法,该方法应释放
using
语句是否总是处理对象,即使其中有返回或抛出异常?即:
using (var myClassInstance = new MyClass())
{
// ...
return;
}
或
如果对象实现IDisposable,则将调用它 通过MSDN使用语句(C#参考) 定义一个范围,一个或多个对象将位于该范围之外 处置 using语句允许程序员指定 使用资源应该释放它们。提供给用户的对象 语句必须实现IDisposable接口。此接口 提供Dispose方法,该方法应释放对象的 资源
是的,这就是重点。它可归纳为:
SomeDisposableType obj = new SomeDisposableType();
try
{
// use obj
}
finally
{
if (obj != null)
((IDisposable)obj).Dispose();
}
注意这里的术语;对象本身未解除分配。调用Dispose()
方法,通常释放非托管资源。不,不释放
但这并不是使用语句的错误。这是因为最终块是如何由CLR处理的。在某些情况下,最终
块将不会执行。如果您有一个未处理的异常,并且CLR认为执行更多代码将导致更多错误,它将不会执行Dispose
方法(因为它不会执行finally
块,而Dispose
方法被编译为..)。因此,要非常小心,不要将生命投入到执行Dispose
方法中
可能导致Dispose
方法无法执行的其他情况如下:
OutOfMemoryException
和StackOverflowException
- 终止进程
- 功率损耗
有些情况下,最终
块将不会按照我的回答执行。
SomeDisposableType obj = new SomeDisposableType();
try
{
// use obj
}
finally
{
if (obj != null)
((IDisposable)obj).Dispose();
}