在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一样.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |