c# - 在 C# 中闭包不是不可变的有什么充分的理由吗?

标签 c# closures mutable

我一直在脑海中反复思考这个问题,但我似乎想不出一个充分的理由说明 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/

相关文章:

c# - N日志。更改类(class)名称

c# - WCF - 如何在 ISO8583 中序列化和反序列化?

c# - MVC - 使用 AJAX 调用导致服务器端页面验证在按钮单击时触发

rust - 除了在每次关闭之前克隆它之外,还有其他选择可以在多个关闭中共享 Arc 吗?

python - 列表更改意外反射(reflect)在子列表中

ruby - 如何防止方法改变其参数?

c# - 我在 asp.net MVC 中进行 session 处理它适用于 View 页面按钮我无法在 Controller 中的另一个操作上获取 session

swift - 无法将返回表达式类型转换为带有闭包的返回类型?

c# - 在 IEnumerator 协程中使用闭包进行澄清

python - python 关键字参数中列表的可变性(?)