理解C#中的Lambda表达式

所属分类: 软件编程 / C#教程 阅读数: 36
收藏 0 赞 0 分享

先来看两段代码:

复制代码 代码如下:

 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表达式的。这对程序员来说无疑又是提高生产力的一个体现!

更多精彩内容其他人还在看

winform用datagridview制作课程表实例

这篇文章主要介绍了winform用datagridview制作课程表的方法,实例分析了WinForm实现课程表的结构、数据库及调用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#中winform控制textbox输入只能为数字的方法

这篇文章主要介绍了C#中winform控制textbox输入只能为数字的方法,包括使用keyPress事件限制键盘输入以及TextChanged事件限制粘贴等情况,来实现控制输入为数字的功能,需要的朋友可以参考下
收藏 0 赞 0 分享

C#省份城市下拉框联动简单实现方法

这篇文章主要介绍了C#省份城市下拉框联动简单实现方法,涉及字典的定义与索引的用法,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#处理MySql多个返回集的方法

这篇文章主要介绍了C#处理MySql多个返回集的方法,实现了对处理MySql多个返回集进行封装,是非常实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#无限参数的写法

这篇文章主要介绍了C#无限参数的写法,通过循环遍历再结合paras.Add方法实现无限参数的功能,是比较实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#反射应用实例

这篇文章主要介绍了C#反射应用,实例分析了通过反射实现多系统数据库的配置方法,是比较实用的技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#窗体传值实例汇总

这篇文章主要介绍了C#窗体传值,实例形式汇总了静态变量传值、委托传值、对话框之间的传值等常见应用技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

C#把数组中的某个元素取出来放到第一个位置的实现方法

这篇文章主要介绍了C#把数组中的某个元素取出来放到第一个位置的实现方法,涉及C#针对数组的常见操作技巧,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C#中Equality和Identity浅析

这篇文章主要介绍了C#中Equality和Identity浅析,本文先是讲解了Equality和Identity的定义,同时讲解了判断两个对象等价性的4种方法,需要的朋友可以参考下
收藏 0 赞 0 分享

在Linux上运行C#的方法

这篇文章主要介绍了在Linux上运行C#的方法,实例分析了Linux平台下Mono软件包的应用技巧,以及在此基础之上的C#运行方法,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多