繁体   English   中英

多个闭包和ReSharper的“访问修改后的关闭”警告

[英]Multiple closures and ReSharper's “Access to Modified Closure” Warning

我有以下代码:

private void SetupCheeseShop(Button buyCheese, Button spoilCheese)
{
    var cheeseCount = 0;    // No cheese

    spoilCheese.Click += (sender, e) => {
        // "Access to Modified Closure" warning occurs for cheeseCount below:
        MessageBox.Show(string.Format("{0} cheeses have spoiled", cheeseCount));

        cheeseCount = 0;    // Throw out moldy cheese
    };


    buyCheese.Click += (sender, e) => {
        cheeseCount++;
    };
}

ReSharper警告我,当我从破坏奶酪处理程序中的cheeseCount读取时,我正在访问一个修改后的闭包。 在这种情况下我可以安全地忽略它吗?

我期望在第一个闭包的调用之间修改奶酪计数,但是我不确定当进行修改的代码在同一个变量周围的第二个闭包中会发生什么。

您可以放心地忽略您的情况下的警告。 它警告您,关闭的变量可能具有与创建闭包时的当前值(0)不同的值。 这就是你想要的。 你可以有任意数量的闭包,它们都引用相同的变量。 将闭包变量视为类中的字段(编译器生成的字段)。

C#语言规范4.0的第5.1.7节所述:

如果局部变量由匿名函数(第7.15.5.1节)捕获,则其生存期至少会延长,直到从匿名函数创建的委托或表达式树以及引用捕获变量的任何其他对象符合垃圾收集。

您可以放心地依赖此行为:无论有多少匿名函数引用它,变量都保持不变,直到收集事件处理程序,直到您的示例中收集按钮本身才会发生这种情况。

您的cheeseCount变量不是字段,变量的范围仅在您自己的方法中。

你应该将cheeseCount从你的方法中移出并使它成为一个领域。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM