-
理解C#中的闭包
网络 2014/4/30 12:39:27闭包的概念
内层的函数可以引用包含在它外层的函数的变量,即使外层函数的执行已经终止。但该变量提供的值并非变量创建时的值,而是在父函数范围内的最终值。
闭包的优点
使用闭包,我们可以轻松的访问外层函数定义的变量,这在匿名方法中普遍使用。比如有如下场景,在winform应用程序中,我们希望做这么一个效果,当用户关闭窗体时,给用户一个提示框。我们将添加如下代码:
private void Form1_Load(object sender, EventArgs e) { string tipWords = "您将关闭当前对话框"; this.FormClosing += delegate { MessageBox.Show(tipWords); }; }
若不使用匿名函数,我们就需要使用其他方式来将tipWords变量的值传递给FormClosing注册的处理函数,这就增加了不必要的工作量。
闭包陷阱
应用闭包,我们要注意一个陷阱。比如有一个用户信息的数组,我们需要遍历每一个用户,对各个用户做处理后输出用户名。
public class UserModel { public string UserName { get; set; } public int UserAge { get; set; } }
List<UserModel> userList = List<UserModel> UserModel{ UserName=, UserAge = UserModel{ UserName=, UserAge = UserModel{ UserName=, UserAge= ( u =>
我们预期的输出是, jiejiep, xiaoyi, zhangzetian
但是实际我们运行后发现,输出了3次 zhangzetian.
为什么没有达到我们预期的效果呢?让我们再来看一下闭包的概念。内层函数引用的外层函数的变量的最终值。就是说,当线程中执行方法时,方法中的u参数的值,始终是foreach遍历的最后一个元素。原来如此,那我们该如何避免闭包陷阱呢?C#中普遍的做法是,将匿名函数引用的变量用一个临时变量保存下来,然后在匿名函数中使用临时变量。
( u ==>
我们再运行来看,输出依次为 jiejiep,xiaoyi, zhangzetian
阅读(750) 分享(0)
上一篇: SSRF攻击实例解析
下一篇: HTML5的本地存储Web Storage介绍