1

次のコードは、CA2000 警告を生成します。

Myclass myclass = null;
try
{
   myclass = new Myclass { Name = "a name" };
}
finally
{
   if (myclass != null)
   {
      myclass.Dispose();
   }
}

私は同じ問題を抱えたいくつかのトピックを見つけました。私が理解しているように、コンパイラはコンストラクターに対して一時変数を生成し、この変数に対しては Dispose() を呼び出していません。

var tmp = new MyClass();
tmp.Name = "a name";
myclass = tmp:

だから私の質問は、ca2000警告を生成しないオブジェクト初期化子を使用する解決策があるかどうかです。

ありがとうございます。

4

1 に答える 1

1

Damienがコメントで指摘しているように、C#コンパイラはIDisposable非表示の変数にインスタンスを作成しtemp、プロパティの1つの初期化中に例外がスローされると、そのインスタンスは破棄されないため、FxCop警告は有効です。

優れたAPI設計では、リソース(実装するもの)に(または、、、など)メソッドIDisposableが含まれている必要があり(フレームワーク設計ガイドラインに従って)、が呼び出される前にリークしてはならないため、これは問題にはなりません。このルールは、初期化中のリークを防ぐために、発生しているのと同じ理由で作成されます。FDGはC#3.0より前に作成されましたが、そのインスタンスのコンストラクター内から例外がスローされた場合にも同じ問題が発生します(これは、スレッドの中止などの非同期例外が原因で常に発生する可能性があります)。その時点ではインスタンスへの参照は公開されていないため、誰もそのインスタンスを破棄する方法はありません。したがって、構築中に基礎となるリソースを初期化することはお勧めしません。OpenBeginStartOpen

したがってMyclass、ある種のOpenメソッドが含まれている場合、およびそれ自体を実装する値で警告を初期化していない場合は、その警告を安全に破棄できますIDisposable。それ以外の場合は、次のように戻す必要があります。

var myclass = new MyClass();

try
{
    myclass.Name = "a name";
}
finally
{
    myclass.Dispose();
}
于 2012-01-05T08:31:07.960 に答える