理解C#中的Lambda表达式
程序员文章站
2022-06-30 11:12:34
先来看两段代码:
复制代码 代码如下:
thread t = new thread(() =>
{
addit adddelegate = n...
先来看两段代码:
复制代码 代码如下:
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#实现系统托盘通知的方法
下一篇: C#泛型设计需要注意的一个小陷阱