C#闭包的陷阱

2022-12-22 0 632

原副标题:C#旋量群的圈套

1、甚么是旋量群?

旋量群最早已开始在JS再次出现的较为多,原意是“透过一系方式,将表达式外部的表达式(局部表达式)转化成为全局表达式。”只不过C#也有旋量群的基本概念:外层的表达式能提及包涵在它外层的表达式的变量,即便外层表达式的继续执行早已中止。但该表达式提供更多的值绝非表达式建立时的值,而要在父表达式范围内的最后值。说得称奇,他们上面具体内容范例看一看。

2、圈套

查阅如下表所示标识符

{ Action[] act = newAction[6]; for( vari = 0; i < act.Length; i++) { act[i] = => { stringstr = “dotnet合作开发挖角”+i; Console.WriteLine(str); }; } foreach ( varitem inact) { item; } }

输入结论:

C#闭包的陷阱

怎么会输入“ dotnet合作开发挖角6”呢?这就是旋量群带来的问题。

3、为啥会这样?

在for循环中,只能有一个 i 表达式。即在第一次循环时,i 的地址就分配好了,不会因为循环次数的多少而发生任何改变,其改变的只能是里面装载的值。当使用匿名方式时传进去的是表达式的地址,不是具体内容值。只有当真正继续执行这个匿名方式时,才会去确定它的值。这就是为甚么上面的范例中,其结论均为“dotnet合作开发挖角6”。

4、怎么避免旋量群圈套

在for循环中增加一个临时表达式t,用来替换i,这时候每次循环编译器会对这个t重新分配内存,就不会再次出现这个问题了。标识符如下表所示:

{ Action[] act = newAction[ 6]; for( vari = 0; i < act.Length; i++) { intt = i; act[i] = => { stringstr = “dotnet合作开发挖角”+ t; Console.WriteLine(str); }; } foreach( varitem inact) { item; } }

C#闭包的陷阱

5、旋量群的优点

旋量群的存在也不是没有意义,在winform合作开发中,使用旋量群中能轻松的访问外层表达式定义的表达式。winform的合作开发者能试一试。

关注公众号: DotNet合作开发挖角

觉得不错,请点个在看

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务