关于Lambda表达式访问外部变量
2018-06-18 03:10:33来源:未知 阅读 ()
在《C#高级编程》一书中提到通过Lambda表达式可以访问Lambda表达式块外部的变量 ,这是一个很好的功能(类似Js中的 闭包)。但是如果没有正确的使用,会非常危险。
比如下面的事例中
int someVal = 5;
Fun<int, int> f = x => x + someVal;
Console.WriteLine(f(3));
我们这个表达式的本意是返回一个数x+5的结果。所以f(3)的结果应该是 3 + someVal = 8。
但是如果以后在不经意中修改了someVal的值,则会出现我们意想不到的结果。
比如:
someVal = 7;
Console.WriteLine(f(3));
此时的打印的结果是10。
特别是当通过多个线程调用Lambda时,我们可能不知道此时someVal的值到底是多少,从而导致不可预知的结果,所以要慎重使用。
那么,在Lambda表达式中使用外部变量的原理是什么呢。
原来,在运行Lambda表达式时,编译器会创建一个匿名类,他可以通过构造函数来传递外部变量。该构造函数的参数取决于外部传递进来的变量个数。对于上面的表达式,匿名类如下所示:
public class AnonymousClass {
private int someVal;
public AnonymousClass(int someVal) { this.someVal = someVal; }
public int Anonymous(int x) { return x + someVal; }
}
这样就可以理解为什么Lambda表达式可以使用外部变量了。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:一个泛型的问题。
下一篇:WPF中多窗口共享静态属性
- 关于各种不同开发语言之间数据加密方法(DES,RSA等)的互通的 2020-06-07
- C++98/11/17表达式类别 2020-05-23
- 关于使用ffmpeg的一些牢骚 2020-05-08
- 表达式·表达式树·表达式求值 2020-04-29
- 定位new表达式与显式调用析构函数 2020-04-20
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash