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();
}