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


此文章转载自互联网-《关于Lambda表达式访问外部变量》

免责声明:

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。

本站信息来自网络收集整理,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序和内容,请支持正版,购买注册,得到更好的正版服务。我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!

发表评论:

抱歉,检测到您未登录,需要评论,请先