DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Disposeメソッドを利用すべきもの

環境/言語:[VB.Net .NetFramework2.0]
分類:[.NET]

クラスの解放が必要なものは必ず、Disposeメソッドの実装を行う必要がありますが、
(エラーが発生する可能性のある場所では例外キャッチを必ず行ってDisposeも実装する)
実際に、どのクラスで必要なのかを判断する方法はあるのでしょうか。

当然、対象クラスのメソッドとしてDisposeがあれば必須だと思うのですが、
既にプログラムを作成しているものに対してチェックするのはかなり手間がかかります。


Disposeメソッドを実装する必要があるものをソースから探す方法や、
実際にアプリが起動している時に、Disposeメソッドを実装していないため、
メモリから開放されていないものを調査する方法はあるのでしょうか。

よろしくお願いします。
■No21884に返信(celestiaさんの記事)
> 実際に、どのクラスで必要なのかを判断する方法はあるのでしょうか。

NCL 的には System.IDisposable インターフェイスが実装されているものです。
必要でないものもありますが、Dispose して不都合になるものは滅多にありません。
(描画周りと Stream 関連で落とし穴があるので注意が必要ですが)

他のプログラマが作ったものでも普通はそのように明示しますが、明示していない人については本人に聞くほかないですね。
>
> NCL 的には System.IDisposable インターフェイスが実装されているものです。
> 必要でないものもありますが、Dispose して不都合になるものは滅多にありません。
> (描画周りと Stream 関連で落とし穴があるので注意が必要ですが)
>
> 他のプログラマが作ったものでも普通はそのように明示しますが、明示していない人については本人に聞くほかないですね。


やはり、各クラスに実装されているか確認するしかないのですね。
プログラム内の変数宣言部を抜き出し、APIから「IDisposable」インターフェースが
実装されているかチェックした上で、対象の変数を抽出するようなツールでも
あれば便利だと思いますね。
その変数がDisposeされているかの確認まではツールを作成するのも大変でしょうが、
一覧抽出ぐらいだったら。。。あとは、自分で目検で確認すればどうにでも。。。
解決済み!
■No21890に返信(celestiaさんの記事)
> プログラム内の変数宣言部を抜き出し、APIから「IDisposable」インターフェースが
> 実装されているかチェックした上で、対象の変数を抽出するようなツールでも
> あれば便利だと思いますね。
> その変数がDisposeされているかの確認まではツールを作成するのも大変でしょうが、
> 一覧抽出ぐらいだったら。。。あとは、自分で目検で確認すればどうにでも。。。

IDisposable かどうかチェック、IDisposable.Dispose メソッドを呼んでいるかチェックするだけですから、案外簡単に IDE に組み込めそうですけどね。
IDisposable の場合はチェックすべきは using があるかどうかかもしれません。

仮にそういうツールがあってもよほど無知な人が大量にコード生成した後でない限りは使わないと思いますけど。
コンパイラのチェックオプションで実装されていても良い機能な気もします。

# そのうち実装されるかもしれませんね。
解決済み!
2008/04/21(Mon) 22:42:48 編集(投稿者)

> コンパイラのチェックオプションで実装されていても良い機能な気もします。
FxCopとか静的コード解析とかで検出自体は実現されているような気がします。

http://msdn2.microsoft.com/ja-jp/library/ms244737.aspx
http://msdn2.microsoft.com/ja-jp/library/ms182172.aspx
http://msdn2.microsoft.com/ja-jp/library/ms182328.aspx

#componentパターンが引っかかるのはどうしようもないかなぁ…。
解決済み!
■No21899に返信(Azuleanさんの記事)
> FxCopとか静的コード解析とかで検出自体は実現されているような気がします。

やはりすでにあるのですね。情報ありがとうございます。
(FxCop は名前自体は知っておりましたが具体的な機能までは知らなくって...)

> componentパターンが引っかかるのはどうしようもないかなぁ…。

まあこれに限らず、この機能自体で役に立つ場面って限られているような気がしますね。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板