2
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 */

})()
4

3 回答 3

12

实际上,即使在 javascript 中,它也不是完全断开的;javascript 允许词法闭包 - 所以没有var, 的旧值foo应该仍然可用。

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

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

于 2009-07-31T12:15:02.410 回答
4

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

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

于 2009-07-31T12:13:01.833 回答
0

由于代码将这两个符号都称为“本地”,因此编译器无法通过向上作用域链(本地 -> 成员 -> 类型)来发现您所指的符号。

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

于 2009-07-31T12:15:09.400 回答