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() 在其他地方调用。命令是一次性关闭。

Resharper 标记这一点的原因是因为此代码没有直接指示实际调用该委托的时间点。原则上,委托的定义可能会在命令被释放后出现(并将被调用)。

Resharper 8.1 是撰写本文时的最新版本,无法确定不能从其他地方真正调用此委托。

于 2014-03-12T19:35:05.013 回答
1

您正在引用commandin action,您可以action在其他地方使用然后 inusingreferenceto 处置command

Resharper 告诉您,您可以访问已处置的闭包,因为在外部使用操作using会导致这种情况。避免使用这样的一次性物品,当然它会抛出NullReferenceException,但很难找到真正的问题。

于 2013-10-08T12:57:35.337 回答