8

可能重复:
什么是“关闭”?
访问修改的闭包
访问修改的闭包 (2)

Resharper 抱怨以下代码:

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

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

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

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

4

1 回答 1

9

是一个相当好的解释。

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

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

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

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

var x = 5;
Action f = () => Console.WriteLine(x);
x = 76;
f();
于 2012-07-18T13:43:03.627 回答