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

前端之家收集整理的这篇文章主要介绍了在C#中,闭包不是不可变的有什么好的理由吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在脑子里反复思考,而且我似乎无法想出为什么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一样.

猜你在找的C#相关文章