CA2000とは
('ω')<CA2000: スコープが失われる前にオブジェクトを破棄します
コード分析の規則セットでは、Microsoftのすべての規則
を選択した場合のみ有効になるようです。
問題
次のようなクラスを定義し、Mainメソッドで初期化してDisposeします。
// MyClass
class MyClass : IDisposable
{
public string Text { get; set; }
public void Dispose( ) { return; }
}
// Program クラス内
static void Main( string[ ] args )
{
var value = new MyClass( )
{
Text = "",
};
value.Dispose( );
}
このコードに対する CA2000 のメッセージは次の通りです。
CA2000 スコープを失う前にオブジェクトを破棄 メソッド 'Program.Main(string[])' で、オブジェクト '<>g__initLocal0' が破棄されない例外パスがあります。オブジェクト '<>g__initLocal0' への参照がすべてスコープ外になる前に、このオブジェクトの System.IDisposable.Dispose を呼び出してください。 ConsoleApplication1 Program.cs 13
原因
MyClass
のText
プロパティで例外が発生する可能性が有ると判断されたためです。
オブジェクト初期化子では、プロパティへの設定が失敗すると参照がvalue
に代入されないため、
MyClass
のインスタンスをDispose
する手段が無くなってしまいます。 usingも無視されます。
詳しくはオブジェクト初期化子の罠を参照して下さい。
対策
IDisposable
なインスタンスの初期化では、オブジェクト初期化子を使用しないようにします。
// Program クラス内
static void Main( string[ ] args )
{
var value = new MyClass( );
try
{
value.Text = "";
}
finally
{
value.Dispose( );
}
}