11

Visual Studio のコード分析ユーティリティでコードを実行すると、解決方法がわからないという警告が表示されます。おそらく、ここにいる誰かが同様の問題に遭遇し、それを解決して、彼らの洞察を喜んで共有しています.

DataGridView コントロールで使用されるカスタム ペイント セルをプログラミングしています。コードは次のようになります。

public class DataGridViewMyCustomColumn : DataGridViewColumn
{
    public DataGridViewMyCustomColumn() : base(new DataGridViewMyCustomCell())
    {
    }

次の警告が生成されます。

CA2000 : Microsoft.Reliability: メソッド 'DataGridViewMyCustomColumn.DataGridViewMyCustomColumn()' で、オブジェクトへのすべての参照が範囲外になる前に、オブジェクト 'new DataGridViewMyCustomCell()' で System.IDisposable.Dispose を呼び出します。

DataGridViewMyCustomCell (またはその継承元のクラス) が IDisposable インターフェイスを実装し、DataGridViewMyCustomCell によって要求されたリソースがなくなったときに Dispose() メソッドを呼び出してクリーンアップする必要があることを警告していることを理解しています。

インターネットで見た例では、using ブロックを使用してオブジェクトの有効期間をスコープし、システムに自動的に破棄させることを提案していますが、コンストラクターの本体に移動すると base が認識されないため、using を記述できませんその周りをブロックします...とにかくやりたいかどうかはわかりません。それは、後で基本クラス内で引き続き使用できるオブジェクトを解放するようにランタイムに指示しないからですか?

私の質問は、コードはそのままで大丈夫ですか? または、警告を解決するためにどのようにリファクタリングできますか? 本当に適切でない限り、警告を抑制したくありません。

4

2 に答える 2

18

Visual Studio 2010 を使用している場合、CA2000 は完全に壊れています。FxCop (別名コード分析) の他のバージョンでも壊れている可能性がありますが、私が保証できるのは VS2010 だけです。私たちのコードベースは、このようなコードに対して CA2000 警告を出しています...

internal static class ConnectionManager 
{
    public static SqlConnection CreateConnection()
    {
         return new SqlConnection("our connection string");
    }
}

...メソッドの範囲外になる前に接続が破棄されていないことを示します。そうですね、それは本当ですが、呼び出し元に返されるため、アプリケーションの範囲外ではありません。それがメソッドの要点です! 同様に、コンストラクターの引数はスコープ外にはなりませんが、基本クラスに渡されているため、実際の問題ではなく、ルールからの誤検出です。

これは以前は便利なルールでしたが、今では修正されるまでオフにするしかありません。(ごく少数の)実際のポジティブな点は修正する必要があるため、これは残念です.

于 2010-04-22T00:26:13.263 に答える