“获得处理关闭”的含义是什么意思?

时间:2013-10-08 12:53:47

标签: c# .net lambda closures resharper

为什么Resharper在下面的代码示例中警告我“访问处理关闭”:

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

我不在using语句之外使用委托...如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

此代码:

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

定义使用命令的委托变量 action 。委托是一个方法定义,可以作为变量传递,并使用 action.Invoke()在其他地方调用。 Command 是一次性封闭。

Resharper标记这一点的原因是因为此代码不直接指示实际调用此委托的时间点。原则上,在处理命令之后,委托的定义可以(并将被调用)。

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

答案 1 :(得分:1)

您在command中引用了action,您可以在actionusing的其他地方使用reference来处置command

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