投稿者 魔界の仮面弁士  () 投稿日時 2008/7/15 20:08:00
>>5 
http://msdn.microsoft.com/ja-jp/library/cc465420.aspx 
上記の記事において、下記のような一文があります。 
 
『そのため、「安全のためだけ」という理由で Finalize をオーバーライドすることは避け、必ず実際にファイナライズが必要な場合にだけオーバーライドしてください。』 
 
 
> あと、使う側で Dispose メソッドが実行されなかった場合の保険として 
> Finalize メソッドを実装しておきガベージコレクタ任せになるけれども 
> 親クラスの Finalize メソッドを呼び出すようにしておく(派生クラスの場合)。 
親クラスの前に、自分自身が持っていたオブジェクトの破棄を考えておきましょう。 
 
破棄対象には、マネージオブジェクト(.NET で管理されるオブジェクト)と 
アンマネージオブジェクト(API で得たハンドルや、COM オブジェクト等)の 
2 種類があります。この違いが重要になってきます。 
 
IDisposable.Dispose では、この両者を解放するように実装します。 
そして Finalize の方は、Dispose 済みならば何もせず、Dispose されて 
いなければ、アンマネージオブジェクトのみを解放させるように実装します。 
(ファイナライズの時点で、マネージオブジェクトを操作してはいけません) 
 
ただし通常、マネージオブジェクトの破棄処理は実装すべきではありません。 
大量のメモリを確保していたような状況など、破棄処理を考慮した方が 
良い場合もあるのですが、ほとんどの場合においては、自分で処理するよりも 
ガベージコレクタに任せた方が良い結果となります。 
 
結果として、IDisposable を実装するのは、アンマネージオブジェクトを 
内包している場合にほぼ限られてきます。 
 
 
> 非共有メンバにアクセスするたのインスタンスに必ず使用している 
厳密には、非共有メンバへのアクセスを発生させることのない、 
Shared Sub New() というコンストラクタも存在します。