none
構文解析で警告CA2000が出る RRS feed

  • 質問

  • DIispose()を実装しているオブジェクト(この場合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日 5:23

回答

  • 外池です。特に問題ないかと・・・。

    ただ、以下のような感じだと、生成(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日 6:27
    • 回答としてマーク MicroVAX 2012年3月16日 8:48
    2012年3月16日 6:24
  • あくまで警告なので、自分で問題ないと判断すれば無視してかまわないと思います。実際、Visual Studioが自動生成したデザイナのコードでもCA2000が出る場合があります。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク MicroVAX 2012年3月16日 8:48
    2012年3月16日 7:23
    モデレータ
  • 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;
    }
    
    • 回答としてマーク MicroVAX 2014年11月28日 4:34
    2012年3月16日 10:33

すべての返信

  • 外池です。特に問題ないかと・・・。

    ただ、以下のような感じだと、生成(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日 6:27
    • 回答としてマーク MicroVAX 2012年3月16日 8:48
    2012年3月16日 6:24
  • あくまで警告なので、自分で問題ないと判断すれば無視してかまわないと思います。実際、Visual Studioが自動生成したデザイナのコードでもCA2000が出る場合があります。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク MicroVAX 2012年3月16日 8:48
    2012年3月16日 7:23
    モデレータ
  • 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;
    }
    
    • 回答としてマーク MicroVAX 2014年11月28日 4:34
    2012年3月16日 10:33