加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C#中,闭包不是不可变的有什么好的理由吗?

发布时间:2020-12-15 18:01:54 所属栏目:百科 来源:网络整理
导读:我一直在脑子里反复思考,而且我似乎无法想出为什么C#闭包是可变的.如果您不知道究竟发生了什么,这似乎是一种获得意想不到的后果的好方法. 也许一个知识渊博的人可以阐明为什么C#的设计者会允许状态在闭包中改变? 例: var foo = "hello";Action bar = () =
我一直在脑子里反复思考,而且我似乎无法想出为什么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一样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读