林中两路分,一路人迹稀。我独选此路,境遇乃相异。

0%

C# lambda表达式


在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}"; };
//MessageHandler handler = (p, msg) => $"{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}";
}
}

所以,以上CreateHandler1CreateHandler2CreateHandler3是等效的。 C#Lambda 表达式都使用Lambda运算符=>,该运算符读为“goes to”, 若要创建Lambda表达式,需要在lambda运算符左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。 例如,单行Lambda表达式(p, msg) => $"{p} says {msg}";指定名为 p,msg 的参数并返回组合字符串。

-------------本文结束 感谢您的阅读-------------
觉得好,点这里 ^_^