我一直在脑海中反复思考这个问题,但我似乎想不出一个充分的理由说明 C# 闭包是可变的。如果您不知道到底发生了什么,这似乎是获得一些意想不到的后果的好方法。
也许知识渊博的人可以阐明为什么 C# 的设计者允许在闭包中更改状态?
例子:
var foo = "hello";
Action bar = () => Console.WriteLine(foo);
bar();
foo = "goodbye";
bar();
这将为第一次调用打印“hello”,但第二次调用时外部状态发生变化,打印“goodbye”。闭包的状态已更新以反射(reflect)对局部变量的更改。
最佳答案
C# 和 JavaScript,以及 O'Caml 和 Haskell 以及许多其他语言都具有所谓的词法闭包。这意味着内部函数可以访问封闭函数中局部变量的名称,而不仅仅是值的副本。当然,在具有不可变符号的语言中,例如 O'Caml 或 Haskell,关闭名称与关闭值是相同的,因此两种类型的闭包之间的差异消失了;然而,这些语言像 C# 和 JavaScript 一样具有词法闭包。
关于c# - 在 C# 中闭包不是不可变的有什么充分的理由吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/483944/