在C#中经常用到委托,其经过进化演变,到C#3.0后引入了lambda表达式,这种表达式与匿名方法的概念类似,但更具表现力并且更简练。 这两个功能统称为匿名函数。
参考:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/anonymous-functions
lambda表达式定义
“Lambda 表达式”(lambda expression)是一个匿名函数,可以表示为委托的代码,或者表示为表达式树的代码,它所表示的表达式树可以编译为委托。 Lambda表达式的特定委托类型取决于其参数和返回值。不返回值的Lambda表达式对应于Action委托,具体取决于其参数数量。 返回值的Lambda表达式对应于Func委托,具体取决于其参数数量。
Lambda 表达式广泛用于:
- 将要执行的代码传递给异步方法,例如 Task.Run(Action)。
- 编写LINQ查询表达式。
- 创建表达式树。
lambda表达式两种形式
表达式lambda,表达式为其主体:
| 1
 | (input-parameters) => expression
 | 
语句lambda,语句块作为其主体:
| 1
 | (input-parameters) => { <sequence-of-statements> }
 | 
C#中委托的演变
C#1.0
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 
 | public class LambdaDemo {public delegate string MessageHandler(string p, string msg);
 
 private string ShowMessage(string p, string msg) {
 return $"{p} says {msg}";
 }
 
 public string LambdaTest1() {
 MessageHandler handler = new MessageHandler(ShowMessage);
 string m = handler("Tom1", "Hello!");
 Console.WriteLine(m);
 return $"LambdaTest1.Value={m}";
 }
 }
 
 | 
C#2.0
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | public class LambdaDemo {public delegate string MessageHandler(string p, string msg);
 
 public string LambdaTest2() {
 MessageHandler handler = delegate (string p, string msg) { return $"{p} says {msg}"; };
 string m = handler("Tom2", "Hello!");
 Console.WriteLine(m);
 return $"LambdaTest2.Value={m}";
 }
 }
 
 | 
C#3.0
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | public class LambdaDemo {public delegate string MessageHandler(string p, string msg);
 
 public string LambdaTest3() {
 MessageHandler handler = (p, msg) => { return $"{p} says {msg}"; };
 
 string m = handler("Tom3", "Hello!");
 Console.WriteLine(m);
 return $"LambdaTest3.Value={m}";
 }
 }
 
 | 
以上3种写法都是等效的。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | public class LambdaDemo {private MessageHandler CreateHandler1() {
 return delegate (string p, string msg) {
 return $"{p} says {msg}";
 };
 }
 
 private MessageHandler CreateHandler2() {
 return (p, msg) => $"{p} says {msg}";
 }
 
 private MessageHandler CreateHandler3()
 => (p, msg) => $"{p} says {msg}";
 
 public string LambdaTest4() {
 MessageHandler handler = CreateHandler3();
 string m = handler("Tom4", "Hello!");
 Console.WriteLine(m);
 return $"LambdaTest4.Value={m}";
 }
 }
 
 | 
所以,以上CreateHandler1、CreateHandler2、CreateHandler3是等效的。 C#的Lambda 表达式都使用Lambda运算符=>,该运算符读为“goes to”, 若要创建Lambda表达式,需要在lambda运算符左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。 例如,单行Lambda表达式(p, msg) => $"{p} says {msg}";指定名为 p,msg 的参数并返回组合字符串。