相信您一定听过这样的几个名词,拉姆达,委托,匿名函数。这三个名词之间有着一定的联系,至于他们的定义百度有很多,我来说说我理解的它们之间的联系和区别。
首先是匿名函数,在c# 2.0时加入了匿名函数。基本上是在定义委托的时候使用匿名函数。如下代码:
//声明一个委托类型
delegate void DelTest();
public void DoSomeThing()
{
DelTest DelT2 = delegate()
{
System.Console.WriteLine("我是一个匿名方法!");
};
}
delegate()={ //代码体 } 这样就是匿名函数。到了C# 3.0 时,有了拉姆达表达式,匿名函数就有了第二种方式。如下代码:
//声明一个委托类型
delegate void DelTest();
public void DoSomeThing()
{
//到了C#3.0时代,又增加了一种更简便的拉姆表达式。
DelTest DelT3 = () => { System.Console.WriteLine("其实,,,我也是一种匿名方法!");};
}
所有,匿名函数有两种:
1> 通过delegate 关键字定义。
2> 通过拉姆达表达式定义。
在有了匿名函数的情况下,定义委托变得更加的简洁明了。从C#1.0到 C#3.0 ,委托经过了这样的定义过程:
//声明一个委托类型
delegate void DelTest();
public void Func1()
{
System.Console.WriteLine("我是一个即将被交由委托执行的方法!");
}
public void DoSomeThing()
{
//在C#1.0时代,委托是这样定义的。
DelTest DelT = new DelTest(Func1);
//到了C#2.0时代,有了匿名函数。通过匿名函数使代码更简洁。
DelTest DelT2 = delegate()
{
System.Console.WriteLine("我是一个匿名方法!");
};
//到了C#3.0时代,又增加了一种更简便的拉姆表达式。
DelTest DelT3 = () => { System.Console.WriteLine("其实,,,我也是一种匿名方法!"); };
}
后来,有了一种新的泛型委托Func<T> 和Action<T>
Func<string> Func1 = () => { return "我是一个有返回值的泛型委托,如果我有多个参数传入,最后一个就是我的返回类型"; };
Func<string, int> Func2 = (string a) => { return 1; };
Action<string> Act1 = (string a) => { /*我是只有参数没有返回值的*/ };
Action<string, int> Act2 = (string a, int b) => { /*我是只有参数没有返回值的*/ };
Func<T>和Action<T> 的区别:
相同:Func和Action都是泛型委托,参数都是可以多个。
不同:Func 是有返回值,当参数任意个时,最后一个就是返回值的类型。Action只有入参,没有出参,没有返回值。