C#闭包的陷阱

本文探讨了C#中的闭包概念,通过一个示例解释了闭包如何导致意外的结果,并分析了出现这种问题的原因。为避免闭包陷阱,建议在循环中使用临时变量。闭包在WinForm开发中有其优势,允许访问外部函数变量。文章还讨论了如何利用闭包的优点并提供了解决闭包问题的方法。
摘要由CSDN通过智能技术生成

原创翔星DotNet开发跳槽      

       

1、什么是闭包?

    闭包最开始在JS出现的比较多,意思是“通过一系方法,将函数内部的变量(局部变量)转化为全局变量。”其实C#也有闭包的概念:内层的函数可以引用包含在它外层的函数的变量,即使外层函数的执行已经终止。但该变量提供的值并非变量创建时的值,而是在父函数范围内的最终值。说得云里雾里,我们下面具体例子看看。

2、陷阱

查看如下代码

输出结果:

 

 

怎么会输出“dotnet开发跳槽6”呢?这就是闭包带来的问题。

3、为啥会这样?

    在for循环中,只能有一个 i 变量。即在第一次循环时,i 的地址就分配好了,不会因为循环次数的多少而发生任何改变,其改变的只能是里面装载的值。当使用匿名方法时传进去的是变量的地址,不是具体值。只有当真正执行这个匿名方法时,才会去确定它的值。这就是为什么上面的例子中,其结果均为“dotnet开发跳槽6”。

4、怎么避免闭包陷阱

    在for循环中增加一个临时变量t,用来替换i,这时候每次循环编译器会对这个t重新分配内存,就不会出现这个问题了。代码如下:

 

 

5、闭包的优点

    闭包的存在也不是没有意义,在winform开发中,使用闭包中可以轻松的访问外层函数定义的变量。winform的开发者可以试一试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值