C#匿名函数范围

时间:2009-07-31 12:11:47

标签: c# lambda anonymous-function

var foo = "bar";

new Func<String>(() => 
{
    var foo = ""; // This can't be done in C#. Why is that?

    /* In JavaScript, this is perfectly valid, since this scope (the anonymous
       function) is disconnected from the outer scope, and any variable declared
       within this scope will not affect variables in the outer scope */

})()

3 个答案:

答案 0 :(得分:13)

实际上,即使在javascript中,也没有完全断开连接; javascript允许词法闭包 - 因此,如果没有varfoo的旧值仍应可用。

不同之处在于javascript 选择以允许您以不同的含义重新声明名称(在内部范围内)。 C#选择不选择。

我发现C#版本不容易混淆!特别是当代码(在方法中更下方)期望讨论“旧”变量时,突然它开始查看“新”变量。

答案 1 :(得分:4)

C#捕获匿名函数中的局部变量。这实际上是一个非常强大的功能,JavaScript也支持,但方式略有不同。

这个概念就是计算机科学家所称的closure。通过捕获局部变量,它们可以成为函数本身状态的一部分,从而为您提供更大的灵活性。

答案 2 :(得分:0)

由于代码将两个符号都称为“本地”,因此编译器无法通过上传范围链(local - &gt; member - &gt; type)来发现您所指的是哪个。

仅供参考,匿名方法被编译为类,并被分配(作为属性)任何方法 他们作为字段访问的成员/本地人。