关于Lambda表达式访问外部变量

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

在《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表达式可以使用外部变量了。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航