为什么即使使用using语句也不会调用Dispose?

时间:2017-11-07 09:05:48

标签: c# dispose

我有这个控制台应用程序(.NET Framework 4.5.2):

class Program
{
    static void Main(string[] args)
    {
        using (var result = new Result())
        {
            result.Test();
        }
    }
}

public class Result : IDisposable
{
    public void Test()
    {
        int a = 1;
        int b = 1 / (a - 1);
    }

    public void Dispose()
    {
        Console.WriteLine("Dispose");
    }
}

为什么不调用Dispose方法?在Dispose - 异常之后DivideByZero未触发断点,并且控制台上没有输出(因为应用程序退出)。

1 个答案:

答案 0 :(得分:7)

根据MS Docs:try-finally (C# Reference)

  

在处理的异常中,保证关联的finally块   要运行。但是,如果异常未处理,则执行   finally块取决于异常展开操作的方式   触发。反过来,这取决于您的计算机的设置方式。

由于您没有捕获DivideByZero异常并且未处理,因此在您的计算机和设置上,它必须在运行任何其他代码行之前关闭应用程序,因此没有运行finally块。

正如@Evk在下面的注释中指出的那样,如果我在没有附加调试器的情况下运行它,它会正确地展开异常并执行finally块。每天学习新东西。

根据Eric Lippert's answer to Finally Block Not Running?

  

想想这种情况有多糟糕:出乎意料的事情   碰巧没有人写过代码来处理。是对的   在那种情况下运行更多的代码,这可能也没有   建立处理这种情况?可能不是。通常是正确的事情   这里做的是不要尝试运行finally块,因为这样做   会让情况变得更糟。你已经知道这个过程了   下降;立刻摆脱痛苦。

     

在未处理的异常将取消的情况下   过程中,一切都会发生。它是实现定义的   在这种情况下发生:是否将错误报告给Windows错误   报告,调试器是否启动等等。 CLR是   完全在其试图运行finally块的权利之内,并且是   也完全在其快速失败的权利范围内。在这种情况下所有   投注已经结束;不同的实现可以选择做不同的   的东西。

相关问题