アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB2005で開発しています。
インターフェースの勉強をしているのですが、
うまく理解できない部分がありましたので、質問させて頂きました。


IDisposableインターフェースを実装したところ、
Disposeメソッドとその中に
GC.SuppressFinalize(Me)
という記述が自動で記載されました。
この「GC.SuppressFinalize(Me)」についての質問です。

これはDisposeメソッドを実行した場合は、
明示的にCOMオブジェクトなどの解放処理が行われるため、
ガベージコレクションの機能を実行しなくて良い
ということが書かれていると思って良いのでしょうか?

そもそもCOMオブジェクトなどは、
明示的に解放しなければ解放できないため、
ガベージコレクションの機能を実行しないことを明示する必要はないのではないか?
と疑問に思ってしまったため、質問させて頂きました。


もし宜しければ、ご回答頂けませんか?
宜しくお願い致します。

A 回答 (1件)

確認を兼ねてまず前提を記載します。


GC が自動的に解放するのはあくまでマネージドリソース(メモリ)だけで、アンマネージドリソース(今回で言うと COM 参照ですね)は対象外です。

さて、MSDN のドキュメントではいまいちどこが重要なのか判りにくいのですが、Dispose デザインパターンを実装する場合には、Finalize からも Dispose を呼び出すように実装しましょう。

http://msdn.microsoft.com/ja-jp/library/fs2xkftw …

こうすることによって、あなたが開発したクラスの利用者が、万が一 Dispose を呼び出し忘れても、最悪 GC の動作タイミングで、Finalize が呼び出され、アンマネージドリソースが解放されます。つまり、GC の仕組みをアンマネージドリソース解放の為のセーフティネットとして利用しましょう、というカラクリなのです。

クラスの利用者が Dispose を呼び出した場合には、Finalize が GC から呼ばれなくても、もはや何も問題は起きないので、GC 呼び出しオーバーヘッドを減らす為に「Finalize を呼ばなくていいよ」と宣言します。これが SuppressFinalize の意味です。

SuppressFinalize を書くと共に Finalize から Dispose を呼ぶ、これを忘れては、上記のカラクリが活きてません。
    • good
    • 0
この回答へのお礼

大変詳しい説明ありがとうございました。
とても良く理解できました。
FinalizeからDisposeを呼び出す部分もうまく理解できずにおりましたので、
とても助かりました。
ありがとうございました。

お礼日時:2008/09/17 10:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!