ソースコードを読んでいて Dispose の扱いについて少し気になったので記事かいてみた
C# のソースコードを読む機会が久々にあったので、プログラミング 関連の記事書いてみます。最近、DBMS ばっかりだったので、久しぶりにプログラム触ると楽しいですね。( 自分の本業は、プログラムだといまだに思ってます!)
楽しいのはさておき、今回は取り扱うお題は、『 Dispose 』です。下記のコードを元に説明をします。※コードは MSDN から引用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class BaseClass : IDisposable |
クラスを使用する側が Dispose メソッドを絶対呼び出すとは限らないので、デストラクタを用意します。但し、その場合二回解放処理が走ってしまうため、GC.SuppressFinalize を呼び出して、二度解放処理が走ってしまうのを抑止します。
しかし、呼び出し側で Dispose を呼び出さないで、ファイナライザーにお世話になるのはあまりよろしくないので、上記ソースの27行目~30行目を下記のように一工夫しましょう。( いやがらせ?いや、Dispose 呼ばない人が悪い...はず。使ったものが必要なくなったらきちんと消すのが基本です(`・ω・´) )
1 2 3 4 5 6 |
~BaseClass() |
下記のようなソースを試してみると動きがよくわかります。簡単な WindowsFormのボタンクリックイベントなどに組み込みます。
1 2 3 4 5 6 |
private void button1_Click(object sender, EventArgs e) |
しばらくすると ( GC.Collect をコールした場合は、すぐ表示されます。 )、下図のメッセージボックスが表示されます。ガーベージコレクトされました。
上図の通り、ガーベージコレクトは行われていますが、高頻度で大量のオブジェクトを使用するようなアプリケーションの場合、ガーベージコレクトが間に合わない場合があります。下記のように、Dispose() メソッドを呼び出して、早期のオブジェクトの解放を促すのがベストです。( 下記のソースの場合、Assert のメッセージボックスは表示されません。 )
1 2 3 4 5 6 7 |
private void button1_Click(object sender, EventArgs e) //GC.Collect(); 気長に待つことができない人は、GC.Collect()をコールしてください。 } |
細かいことですが ( 細かくない... )、高品質なアプリケーションを開発する上で非常に重要ですね。( IDisposable インターフェイス (System) を実装しているクラスを使い終わったら、Dispose を呼ぶこと!です。 ) ※うう、もう三時だ。明日起きることができるのか.......乱文乱筆ご容赦ください。
※独習シリーズ!
- 作者: ハーバート・シルト,エディフィストラーニング株式会社矢嶋聡
- 出版社/メーカー: 翔泳社
- 発売日: 2010/12/03
- メディア: 大型本
- 購入: 5人 クリック: 55回
- この商品を含むブログ (6件) を見る
※これも読んだなぁ。
[完全版] 究極のC#プログラミング ~新スタイルによる実践的コーディング
- 作者: 川俣晶
- 出版社/メーカー: 技術評論社
- 発売日: 2009/05/22
- メディア: 大型本
- 購入: 13人 クリック: 143回
- この商品を含むブログ (24件) を見る
※おお、もう第7版。
- 作者: Ian Griffiths,鈴木幸敏,風間一洋,木村英一,黒川利明,頃末和義,佐藤嘉一,出葉義治,西山博泰,稲垣達夫
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/11/29
- メディア: 大型本
- この商品を含むブログ (3件) を見る
- 作者: Jay Hilyard,Stephen Teilhet,鈴木幸敏
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/08/25
- メディア: 大型本
- 購入: 8人 クリック: 111回
- この商品を含むブログ (23件) を見る