【问题标题】:What does "access to disposed closure" mean here?“访问已处置的闭包”在这里是什么意思?
【发布时间】:2013-10-15 09:50:46
【问题描述】:

为什么 Resharper 在以下代码示例中警告我“访问已处置的闭包”:

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

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

【问题讨论】:

    标签: c# .net lambda closures resharper


    【解决方案1】:

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

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

    【讨论】:

    • 如果我错了请告诉我,但它不会抛出 ObjectDisposedException 而不是 NRE?
    【解决方案2】:

    这段代码:

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

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

    Resharper 标记这个的原因是因为这段代码没有直接指出这个委托将在什么时间点被实际调用。原则上,委托的定义可能会在 command 被释放之后出现(并将被调用)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 2021-04-14
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多