VB2005で開発しています。
インターフェースの勉強をしているのですが、
うまく理解できない部分がありましたので、質問させて頂きました。
IDisposableインターフェースを実装したところ、
Disposeメソッドとその中に
GC.SuppressFinalize(Me)
という記述が自動で記載されました。
この「GC.SuppressFinalize(Me)」についての質問です。
これはDisposeメソッドを実行した場合は、
明示的にCOMオブジェクトなどの解放処理が行われるため、
ガベージコレクションの機能を実行しなくて良い
ということが書かれていると思って良いのでしょうか?
そもそもCOMオブジェクトなどは、
明示的に解放しなければ解放できないため、
ガベージコレクションの機能を実行しないことを明示する必要はないのではないか?
と疑問に思ってしまったため、質問させて頂きました。
もし宜しければ、ご回答頂けませんか?
宜しくお願い致します。
No.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 を呼ぶ、これを忘れては、上記のカラクリが活きてません。
大変詳しい説明ありがとうございました。
とても良く理解できました。
FinalizeからDisposeを呼び出す部分もうまく理解できずにおりましたので、
とても助かりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- その他(教育・科学・学問) 某大学のコンプライアンス室に通報しても規程を無視して「不受理」という回答しかしない場合の対応策 2 2022/04/19 23:56
- 英語 関係代名詞「非制限用法」が説明する先行詞が無冠詞複数形の場合「一般的総称」と見なすことの可否について 10 2022/07/20 10:19
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Visual Basic(VBA) vba メモリ節約 3 2022/09/16 21:45
- ヤフオク! Q1)ヤフオクで落札直後、裁判がどうこう言ういきなり出品者の身勝手で落札者に対して失礼な自己満ルール 6 2023/08/12 10:57
- オープンソース IT用語、ソースとオブジェクト、改変と翻訳と翻案の違いなど どのようにりかいすればよいのですか 1 2022/09/09 10:02
- 大学受験 現代文について教えください。 問題 傍線部1「科学的方法」とあるが、それは具体的にいうとどのような方 3 2022/10/16 20:31
- Visual Basic(VBA) <excel vba>selenium basicのWebDriverの自動更新のエラーについて 1 2022/10/01 17:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
同じソリューション内の別のプ...
-
バイナリーデータを16進数に...
-
Q&Aフォームを作成したいのです...
-
チャレンジタッチの画面にスマ...
-
エクセルVBAで画面の大きさを取...
-
画面遷移が不正ですと表示されます
-
数字のみ入力可
-
【ASP.NET】ページ遷移してもGr...
-
Accessの画面更新を一時的に停...
-
ASP.NET 電卓計算
-
別ブラウザにセッションを渡す...
-
【ASP.NET】フォームの継承は出...
-
Acrobatのツールボタンの消し方
-
ASP.NetのGridViewで任意の行ク...
-
VB.netでボリュームレベルメー...
-
【ASP.NET】マスターページに配...
-
Excel:「フォーム」のボタンで...
-
TabStripのイベントについて
-
VS2005 ASP.NET GridView...
-
フレーム表示されているページ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同じソリューション内の別のプ...
-
実行時にコントロールのイベン...
-
コネクション・セッション・ト...
-
Accessの画面更新を一時的に停...
-
画面遷移が不正ですと表示されます
-
HTMLボタンの文字色を変え...
-
c# 文字列の最後から1文字削除...
-
DataGridViewのチェックボック...
-
VBAで一時中断したプログラムの...
-
複数選択のListBoxでClickイベ...
-
Eclipseでクリーンが出来ない
-
チャレンジタッチの画面にスマ...
-
エクセルVBAで画面の大きさを取...
-
ブラウザの×ボタン(閉じるボタ...
-
ACCESS2010 WEBブラウザーコン...
-
asp.NET初心者です。「 ’Contex...
-
DVD-Rの「セッションを閉じる」...
-
ASPで画面間のパラメタ受け渡し
-
コンピュータへの接続数が最大...
-
ブラウザの×(閉じる)ボタンの...
おすすめ情報