我在 MSDN 上找到了以下代码:
public class DisposeExample
{
public class MyResource: IDisposable
{
private IntPtr handle;
private Component component = new Component();
private bool disposed = false;
public MyResource(IntPtr handle)
{
this.handle = handle;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!this.disposed)
{
if(disposing)
{
// Dispose managed resources.
component.Dispose();
}
CloseHandle(handle);
handle = IntPtr.Zero;
disposed = true;
}
}
~MyResource()
{
Dispose(false);
}
}
public static void Main()
{
MyResource obj = new MyResource()
//obj.dispose()
}
}
现在我在这里的困惑是,如果我调用 obj.dispose,它会处理在 MyResources 类中创建的对象,即句柄、组件等。但是 obj 是否也会从堆中删除?同样适用于析构函数。如果我不调用 dispose,则有时会调用析构函数。析构函数中的代码删除了包含的对象。但是obj呢?其次,如果我没有在类中定义析构函数并且我什至不调用 dispose,那么 GC 是否永远不会出现在这里?