【问题标题】:Can someone explain "access to modified closure" in C# in simple terms? [duplicate]有人可以用简单的术语解释 C# 中的“访问修改后的闭包”吗? [复制]
【发布时间】:2012-07-17 13:38:56
【问题描述】:

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

Resharper 抱怨以下代码:

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

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

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

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

【问题讨论】:

标签: c# closures


【解决方案1】:

Here 是一个很好的解释。

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

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

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

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

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

【讨论】:

  • 如果您提供的链接失效,请在您的答案中至少提供一些解释。
  • 太棒了!谢谢!现在清楚多了!
猜你喜欢
  • 2021-02-28
  • 2015-04-09
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
相关资源
最近更新 更多