コンパイラの警告 (レベル 2) CS0728
更新 : 2007 年 11 月
エラー メッセージ
using または lock ステートメントの引数であるローカルの '変数' への割り当てが間違っている可能性があります。Dispose の呼び出しまたはロック解除がローカルの元の値で実行されます。
using ブロックまたは lock ブロックで一時的なリソース リークが発生する場合があります。次に例を示します。
thisType f = null;
using (f)
{
f = new thisType();
...
}
この場合、thisType 変数の元の値 (null など) は、using ブロックの実行が終了した時点で破棄されます。しかし、このブロック内で生成された thisType オブジェクトについては、最終的にガベージ コレクションが実行されるまで破棄されません。
このエラーを解決するには、次のようにします。
using (thisType f = new thisType())
{
...
}
これで、新たに割り当てられた thisType オブジェクトが破棄されるようになります。
使用例
次のコードでは、CS0728 警告が生成されます。
// CS0728.cs
using System;
public class ValidBase : IDisposable
{
public void Dispose() { }
}
public class Logger
{
public static void dummy()
{
ValidBase vb = null;
using (vb)
{
vb = null; // CS0728
}
vb = null;
}
public static void Main() { }
}