Try-Finally Dispose和Using-statement之间的区别

Mat*_*ijs 5 .net c# dispose

我一直在深入研究微软的Code Analysis,偶然发现了一些非常有趣的东西..NET似乎使用两种不同类型的Dispose,具体取决于它的调用方式.请选择以下两个选项:

public void SqlConnectionUsing()
{
    using (SqlConnection connection = new SqlConnection())
    {
    }
}

public void SqlConnectionFinally()
{
    SqlConnection connection = new SqlConnection();
    try
    {
    }
    finally
    {
        connection.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

这两个选项都被翻译成完全相同的东西; 在编译期间.using成为一个try-finally语句,在finally语句中调用Dispose方法.

我说一个处置法; 因为什么样的dispose方法取决于你编写代码的方式.

当去的时候using-statement,一个电话就到了callvirt instance void [mscorlib]System.IDisposable::Dispose()(这是确切的IL线).

并手动执行try-finally选项,dispose语句更改为:callvirt instance void [System]System.ComponentModel.Component::Dispose().

为什么调用dispose函数会有区别?

如果需要,我可以添加整个IL代码.

C.E*_*uis 4

在编译过程中,该using语句翻译为:

try
{
}
finally
{
    ((IDisposable)connection).Dispose();
}
Run Code Online (Sandbox Code Playgroud)

实际上,您可以Dispose()在同一个类中定义两个方法,一个是为IDisposable接口显式定义的方法,另一个是类方法:

public class X : IDisposable
{
    void IDisposable.Dispose() { } 
    public void Dispose() { }
}
Run Code Online (Sandbox Code Playgroud)

不过,如果让这些方法有不同的行为,你真的可能会毁掉某人的一天。

此外,您可以Dispose()在不实现的类中创建方法IDisposable,但无法将其放在using语句中。

  • 仅供参考,“using”带有“null”检查。 (2认同)