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 を呼び出さないと、いつかデストラクタが呼び出されます。デストラクタ内のコードは、含まれているオブジェクトを削除します。しかし、オブジェクトはどうですか?第二に、クラス内でデストラクタが定義されておらず、dispose を呼び出すことさえしていない場合、GC はここに表示されませんか?