構文解析で警告CA2000が出る
-
2012年3月16日 5:23DIispose()を実装しているオブジェクト(この場合bmp)を返すそうとするとCA2000が警告されます。単純に無視して良いと思っているのですが気になります。実際無視して安全でしょうか?あるいは、警告が出ないようデザインを改善したほうが良いのでしょうか?
private Bitmap CreateTestBitmap()
{
// 警告4 CA2000 : Microsoft.Reliability :
// オブジェクト 'bmp' への参照がすべてスコープ外になる前に、
// そのオブジェクトの System.IDisposable.Dispose を呼び出してください。
Bitmap bmp = new Bitmap(640, 480, PixelFormat.Format24bppRgb);
// 画像処理...(省略)
// bmpを返すのでDispose()したらダメ!ですよね。
return bmp;
}C#開発者
すべての返信
-
2012年3月16日 6:24
外池です。特に問題ないかと・・・。
ただ、以下のような感じだと、生成(new)と破棄(Dispose)のペアがわかりやすい、ということだけかだと思います。でも、お示しになっているプログラムは、メソッドの名前に「Create」が入っているので、十分読み易いと思います。
Bitmap bmp = new Bitmap(640, 480, PixelFormat.Format24bppRgb);
PrepareTestImage(bmp); //画像処理(省略されたもの)
UtilizeTheImage(bmp);//画像の利用
bmp.Dispoe();あるいは、
Using(Bitmap bmp = new Bitmap(640, 480, PixelFormat.Format24bppRgb)){
PrepareTestImage(bmp); //画像処理(省略されたもの)
UtilizeTheImage(bmp);//画像の利用
}
(ホームページを再開しました)
-
2012年3月16日 7:23モデレータ
あくまで警告なので、自分で問題ないと判断すれば無視してかまわないと思います。実際、Visual Studioが自動生成したデザイナのコードでもCA2000が出る場合があります。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
- 回答としてマーク MicroVAX 2012年3月16日 8:48
-
2012年3月16日 10:33
CA2000 の説明に、本来すべき対処例が書かれてますね。
CA2000: スコープが失われる前にオブジェクトを破棄します
http://msdn.microsoft.com/ja-jp/library/ms182289.aspx警告の有無とは無関係に(というか私のにコード分析ついてません・・・)、私はなるべくこう書くようにしてます。
private Bitmap CreateTestBitmap() { Bitmap bmp = new Bitmap(640, 480, PixelFormat.Format24bppRgb); try { // 画像処理... } catch { bmp.Dispose(); throw; } return bmp; }

