在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
1 2 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
1 2 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
1 2 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种写法都是等效的。
1 2 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
的参数并返回组合字符串。