这里的“访问处置关闭”是什么意思

本文关键字:是什么 意思 访问 这里 | 更新日期: 2023-09-27 18:34:19

为什么 Resharper 在以下代码示例中警告我有关"访问已释放的闭包":

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

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

这里的“访问处置关闭”是什么意思

此代码:

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

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

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

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

您在

action中引用command,您可以在其他地方使用action,然后在using中使用,reference处理command

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