我一直在脑子里反复思考,而且我似乎无法想出为什么C#闭包是可变的.如果您不知道究竟发生了什么,这似乎是一种获得意想不到的后果的好方法.
也许一个知识渊博的人可以阐明为什么C#的设计者会允许状态在闭包中改变?
例:
var foo = "hello"; Action bar = () => Console.WriteLine(foo); bar(); foo = "goodbye"; bar();
这将为第一个呼叫打印"hello",但外部状态在第二个呼叫时改变,打印"再见".更新了闭包的状态以反映局部变量的更改.
C#和JavaScript,以及O'Caml和Haskell以及许多其他语言都有所谓的词法闭包.这意味着内部函数可以访问封闭函数中的局部变量的名称,而不仅仅是值的副本.当然,在具有不可变符号的语言中,例如O'Caml或Haskell,关闭名称与结束值相同,因此两种类型的闭包之间的差异消失了; 尽管如此,这些语言仍然具有词汇封闭,就像C#和JavaScript一样.