Visual Studio 2010 (主に C# 4.0) 開発標準の一部として、コード分析が有効になっています。最近提出された新しいプロジェクトのコードをレビューしていると、大量のコードが表示されます。
CA2000 : Microsoft.Reliability: メソッド 'XYZ' で、オブジェクト 'ABC' がすべての例外パスで破棄されていません。オブジェクト 'ABC' へのすべての参照が範囲外になる前に、オブジェクト 'ABC' で System.IDisposable.Dispose を呼び出します。
警告。問題は、私が何をしても警告が消えるように見えないことです。私は何時間もかけて Web を精査し、できる限りのことを試しました。
最初に、ローカル変数を適切に破棄するために単純な using ブロックを入れることについて話しているのではないことを明確にさせてください。それは問題ではありません。私の場合、これらの警告は、オブジェクトがメソッドによって返されるか、メソッド内の別のオブジェクトに割り当てられたときに表示されます。
このような警告を 4 つ含むコード サンプルを次に示します。
public void MainMethod()
{
var object1 = CreateFirstObject(); // Warning here
var object2 = CreateSecondObject(); // Warning here
SomeCollectionProperty.Add(object1);
SomeCollectionProperty.Add(object2);
}
private SomeObject CreateFirstObject()
{
var theObject = new SomeObject() // Warning here
{
FirstProperty = "some value",
// ...
};
return theObject;
}
private SomeOtherObject CreateSecondObject()
{
var theObject = new SomeOtherObject() // Warning here
{
FirstProperty = "a different value",
// ...
};
return theObject;
}
警告が発生する行にコメントしました。
MSDN の記事 (こちら)で説明されているように、両方の Create メソッドをリファクタリングしようとしましたが、それでも警告が表示されます。
更新 SomeObject と SomeOtherObject の両方が IDisposable を実装していることに注意してください。
また、オブジェクト初期化子が問題の構成要素である可能性がありますが、初期化子は 2 つのプライベート メソッドに分離されており、MainMethod の警告とは関係がないことに注意してください。
これらのメソッドを適切に実装して CA2000 の警告を排除する方法を誰か教えてもらえますか?