>我有这个测试代码。为什么在 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
}
这将在该时间点附加调试器。