手机
当前位置:查字典教程网 >编程开发 >C#教程 >理解C#中的Lambda表达式
理解C#中的Lambda表达式
摘要:先来看两段代码:复制代码代码如下:Threadt=newThread(()=>{AddItAddDelegate=newAddIt(AddI...

先来看两段代码:

复制代码 代码如下:

Thread t = new Thread(() =>

{

AddIt AddDelegate = new AddIt(AddItem);

this.Invoke(AddDelegate);

});

Thread t3 = new Thread(new ThreadStart(() =>

{

AddIt AddDelegate = new AddIt(AddItem);

this.Invoke(AddDelegate);

}));

这两种写法都是可以的,出来的IL也一样,但是意义是不同的,后者相当于匿名方法,前者

更像是"匿名"的委托,其实这样写:

复制代码 代码如下:

Thread t2 = new Thread(() =>

{

this.Invoke(new AddIt(() => { this.listBox1.Items.Add("bbb"); }));

});

这个跟上面两种写法也是一样的效果,初次接触的时候,可能大家跟我一样会有些迷茫,Lamdba表达式到底该怎么用呢?

首先还是要弄清Lamdba表达式的几个特性:

1. Lamdba 表达式是一个委托类型:

复制代码 代码如下:

MethodInvoker invoker = () => { Console.WriteLine(); };

//is actually equal to the following form.

MethodInvoker invoker = delegate() { Console.WriteLine(); };

//这里是Lamdba 表达式的匿名委托的用法

2. Lamdba 表达式可以用作匿名方法

复制代码 代码如下:

MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });

//相当于:

MethodInvoker invoker = new MethodInvoker(MyFunc);

partial void MyFunc()

{

Console.WriteLine();

}

我们知道, 当构造一个新的委托的时候, 他的构造器需要一个函数指针作参数,这个函数指针是委托类型的

实际上,当我们这样去new 一个委托的时候:

复制代码 代码如下:

MethodInvoker invoker = new MethodInvoker(MyFunc);

"MyFunc" 就是一个委托,而不只是一个函数名的存在. 编译器将为这个构造函数生成一个匿名委托:

复制代码 代码如下:

MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });

可以这样理解编译器的行为: 匿名方法其实也就是委托。

那么为什么我们可以这么写呢:

复制代码 代码如下:

MethodInvoker invoker = () => { Console.WriteLine(); };

我们来看一看:

首先,这个委托的构造器需要一个委托参数,所以通常我们得这样写:

复制代码 代码如下:

MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });

但是匿名的delegate 可以转化成函数指针 (void() target):

所以这样写是可以的:

复制代码 代码如下:

MethodInvoker invoker = new MethodInvoker(MyFunc);

//而匿名的委托又可以描述为Lambda表达式

MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });

//另外一方面,由于编译器对"宽松委托"的支持, MethodInvoker类委托可以转化成匿名类委托:

复制代码 代码如下:

MethodInvoker invoker = delegate() { Console.WriteLine(); };

//而匿名的委托又可以用Lambda表达式来描述

MethodInvoker invoker = () => { Console.WriteLine(); };

从上面,我们可以看到一个复杂的委托是如何转化成简洁的Lambda表达式的。这对程序员来说无疑又是提高生产力的一个体现!

【理解C#中的Lambda表达式】相关文章:

C#中读写INI文件的方法例子

在C#中 webbrowser的使用心得

解析XPath语法之在C#中使用XPath的示例详解

深入理解C#序列化与反序列化的详解

解析C#中的ref和out参数

解析C#中@符号的几种使用方法详解

C#3.0中Lambda表达式详解

深入分析缓存依赖中cachedependency对象及周边小讲

解析C#中如何把控件的边框角画为圆弧

C#中using的三种用法

精品推荐
分类导航