理解C#中的Lambda表达式
作者:junjie 时间:2022-10-30 07:50:23
先来看两段代码:
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,表达式
0
投稿
猜你喜欢
java计算给定字符串中出现次数最多的字母和该字母出现次数的方法
2022-01-13 03:00:04
Java基础知识之StringWriter流的使用
2023-01-19 00:47:52
Android实现左右滑动切换图片
2021-06-20 10:51:30
Apache commons fileupload文件上传实例讲解
2021-09-09 17:19:29
java实现客房管理系统
2022-10-15 23:56:33
Android 仿京东、拼多多商品分类页的示例代码
2023-05-02 13:55:30
详解java爬虫jsoup解析多空格class数据
2021-12-30 14:47:41
SpringMVC域对象共享数据示例详解
2023-03-10 22:21:21
MyBatis在注解上使用动态SQL方式(@select使用if)
2023-09-24 06:52:55
Java 获取Web项目相对webapp地址的实例
2022-07-03 17:46:00
C#实现洗牌游戏实例
2021-07-07 00:45:29
Spring实战之Bean定义中的SpEL表达式语言支持操作示例
2021-07-07 10:46:19
灵活使用Android中ActionBar和ViewPager切换页面
2022-07-08 17:20:09
Spark Streaming算子开发实例
2023-03-17 02:28:41
C#判断一个矩阵是否为对称矩阵及反称矩阵的方法
2023-04-04 10:55:23
Java二维数组实战案例
2022-08-13 08:59:25
Spring钩子接口汇总分析使用示例
2022-09-24 23:29:56
Java面试题冲刺第十六天--消息队列
2022-08-08 09:07:04
简介Android应用中sharedPreferences类存储数据的用法
2023-04-30 22:34:48
Springboot引入多个yml方法(多种方案)
2023-07-21 21:10:48