C#匿名函数作用域 var foo=“bar”; 新函数(()=> { var foo=”“//这不能在C中完成。为什么? /*在JavaScript中,这是完全有效的,因为这个作用域(匿名 函数)与外部作用域断开连接,并声明任何变量 此范围内的变量不会影响外部范围内的变量*/ })()

C#匿名函数作用域 var foo=“bar”; 新函数(()=> { var foo=”“//这不能在C中完成。为什么? /*在JavaScript中,这是完全有效的,因为这个作用域(匿名 函数)与外部作用域断开连接,并声明任何变量 此范围内的变量不会影响外部范围内的变量*/ })(),c#,lambda,anonymous-function,C#,Lambda,Anonymous Function,C#捕获匿名函数中的局部变量。这实际上是JavaScript也支持的一个非常强大的功能,但方式略有不同 这个概念就是计算机科学家所说的一个概念。通过捕获局部变量,它们可以成为函数本身状态的一部分,从而为您提供更大的灵活性。实际上,即使在javascript中,它也没有完全断开连接;javascript允许词法闭包-因此如果没有var,那么foo的旧值应该仍然可用 区别在于javascript选择了,允许您以不同的含义(在内部范围内)重新声明名称。C#选择不 我发现C#版本不那么容易混淆!特别是当

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


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

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

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


我发现C#版本不那么容易混淆!特别是当代码(在方法的下面)希望谈论“旧”变量时,它突然开始寻找“新”变量。

由于代码将这两个符号都称为“局部变量”,编译器无法简单地通过向上移动作用域链(local->member->type)来发现您所指的是哪一个

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

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

})()