为什么使用 不调用调试器中的 dispose 方法



>我有这个测试代码。为什么在 using 语句中引发异常时不调用 dispose 方法?根据文档,它应该被调用。

using System;
using System.IO;
using System.Text;
namespace UsingTest {
    class Program {
    public class MyClass : IDisposable
    {
        private bool disposed = false;
        public void Dispose() {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        public void Dispose(bool disposing) {
            if (!disposed) {
                if (disposing) {
                    using (var f = new FileStream("log.txt", FileMode.Create)) {
                        var msg = "MyClass disposed";
                        f.Write(Encoding.UTF8.GetBytes(msg), 0, Encoding.UTF8.GetByteCount(msg));
                    }
                }
                disposed = true;
            }
        }
        ~MyClass() {
            Dispose(false);
        }
    }
    static void Main(string[] args) {
        using (var c = new MyClass()) {
            Console.WriteLine("some work");
            throw new Exception("Exception");
            Console.WriteLine("Hello World!");
        }
    }
}
}

谢谢。

static void Main(string[] args) {
        using (var c = new MyClass()) {
            Console.WriteLine("some work");
            throw new Exception("Exception");
            Console.WriteLine("Hello World!");
        }
    }

这将创建一个新的MyClass
实例在实例化时,它会写入控制台。然后引发异常。出现异常时,调试器会介入,并尝试帮助您调试代码。Visual Studio 中的调试器将保持足够长的运行代码以执行此操作 - 调试它。

if you will run it from Visual Studio with debugger - it will not be called

调试器停止运行/侦听代码调用该方法(Dispose(。

不会

命中Dispose中的断点,因为调试器不再存在。代码未运行,因为运行时已退出(按 Visual Studio 确定您现在已完成的顺序(

如果您在不调试的情况下运行它 (ctrl+f5(,您还将看到创建的文件。

尝试在 Dispose 方法中放置一个System.Diagnostics.Debugger.Launch();,如下所示:

public void Dispose(bool disposing) {
    System.Diagnostics.Debugger.Launch();
    //etc
}

这将在该时间点附加调试器。

最新更新