关于Lambda表达式访问外部变量_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 关于Lambda表达式访问外部变量

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

 2014/9/27 12:53:04  ty3537  程序员俱乐部  我要评论(0)
  • 摘要:在《C#高级编程》一书中提到通过Lambda表达式可以访问Lambda表达式块外部的变量,这是一个很好的功能(类似Js中的闭包)。但是如果没有正确的使用,会非常危险。比如下面的事例中intsomeVal=5;Fun<int,int>f=x=>x+someVal;Console.WriteLine(f(3));我们这个表达式的本意是返回一个数x+5的结果。所以f(3)的结果应该是3+someVal=8。但是如果以后在不经意中修改了someVal的值,则会出现我们意想不到的结果
  • 标签:Lambda表达式 表达式

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

上一篇: 为什么人人都要学编程 下一篇: 没有下一篇了!
发表评论
用户名: 匿名