有人可以解释"访问修改后的闭包"用C#简单来说?

时间:2012-07-18 13:37:30

标签: c# closures

  

可能重复:
  What is a 'Closure'?
  Access to Modified Closure
  Access to Modified Closure (2)

Resharper抱怨下面这段代码:

foreach (string data in _dataList)
    DoStuff (() => field);

什么是封闭?我为什么要关心?

我已经读过关于数学和函数式编程的闭包,我在这里不知所措。对我的大脑来说太沉重了。

简单来说,这里发生了什么?

1 个答案:

答案 0 :(得分:9)

Here是一个相当不错的解释。

当您从委托引用方法体中的变量时,会创建一个闭包。实质上,生成包含对局部变量的引用的类 如果不断修改变量,当外部方法调用委托时,它可能包含不可预测的值,甚至抛出异常。 例如,在这样的示例中:

foreach (string data in _dataList)
{
    DoStuff (() => data);
}

方法() => data始终是相同的方法。如果你存储它,你不知道它最终被调用时会发生什么 - data当时的值是多少?它甚至会有效吗?如果您使用yield return,这会特别危险。

没有迭代器的更简单的例子是:

var x = 5;
Action f = () => Console.WriteLine(x);
x = 76;
f();