2

次のコード サンプルで、Resharper が「破棄されたクロージャへのアクセス」について警告するのはなぜですか。

using (SqlCommand command = new SqlCommand())
{
    command.Parameters.Add("@temp", SqlDbType.VarChar);
    Action<string> action = str =>
        {
            command.Parameters["@temp"].Value = string.Empty;
        };
}

usingデリゲート外部ステートメントを使用していません...これを修正するにはどうすればよいですか?

4

2 に答える 2

6

このコード:

Action<string> action = str =>
{
    command.Parameters["@temp"].Value = string.Empty;
};

commandを使用するデリゲート変数アクションを定義します。デリゲートは、変数として渡すことができるメソッド定義であり、action.Invoke()を使用して別の場所で呼び出すことができます。Commandは使い捨てクロージャーです。

Resharper がこれにフラグを付ける理由は、このコードが、このデリゲートが実際にどの時点で呼び出されるかを直接示していないためです。原則として、コマンドが破棄された後にデリゲートの定義が存在する (そして呼び出される) 可能性があります。

この記事の執筆時点での最新バージョンである Resharper 8.1 では、このデリゲートが他の場所から実際に呼び出されないことを判断できません。

于 2014-03-12T19:35:05.013 に答える
1

inを参照commandしていactionます。 in を別の場所で使用actionしてから、 inusingおよびreferenceto Discarded を使用できますcommand

Resharper は、破棄されたクロージャーにアクセスできることを示しています。これは、アクションを外部で使用usingするとそれが発生するためです。そのような使い捨てオブジェクトの使用は避けてください。もちろんスローNullReferenceExceptionされますが、実際の問題を見つけるのは難しい場合があります。

于 2013-10-08T12:57:35.337 に答える