【C#】lambda , lambda 表达式语法
Lambda 表达式是 C# 中一种非常简洁且强大的语法结构,它允许你定义匿名方法。简而言之,Lambda 表达式可以看作是一个简化的匿名方法或者匿名函数。
Lambda 表达式基础
Lambda 表达式的语法可以用于定义函数、委托、事件等,并且通常比传统的匿名方法更简洁。其基本语法形式如下:
(parameters) => expression_or_statement_block
语法分解
parameters
:参数列表,可以为空或包含多个参数。=>
:Lambda 运算符,用于分隔参数和方法体。expression_or_statement_block
:可以是一个表达式(当 Lambda 返回值时)或者是一个语句块(当 Lambda 是一个复杂方法时)。
1. 不带参数的 Lambda 表达式
如果 Lambda 表达式不需要参数,可以省略参数列表,直接使用 ()
表示。
语法
() => expression
示例
Action sayHello = () => Console.WriteLine("Hello, World!");
sayHello(); // 输出 "Hello, World!"
这里的 Action
是一个不返回值的委托类型(即返回类型是 void
)。Lambda 表达式 () => Console.WriteLine("Hello, World!")
相当于一个没有参数、执行 Console.WriteLine("Hello, World!")
的方法。
2. 带参数的 Lambda 表达式
Lambda 表达式可以带有参数,参数列表类似于方法的参数列表。
语法
(parameters) => expression_or_statement_block
示例
Func<int, int, int> add = (a, b) => a + b;
int result = add(3, 4); // result = 7
Console.WriteLine(result); // 输出 7
这里,Func<int, int, int>
是一个委托类型,表示一个接受两个 int
类型参数并返回 int
类型的函数。Lambda 表达式 (a, b) => a + b
定义了一个方法,该方法接受两个参数 a
和 b
,并返回它们的和。
带有多个参数的 Lambda 表达式
Lambda 表达式可以有多个参数,多个参数之间用逗号分隔。
示例
Action<string, int> printMessage = (message, count) =>
{
for (int i = 0; i < count; i++)
{
Console.WriteLine(message);
}
};
printMessage("Hello, Lambda!", 3); // 输出 "Hello, Lambda!" 三次
在这个例子中,Action<string, int>
是一个接受两个参数(一个字符串和一个整数)的委托类型。Lambda 表达式 (message, count) => { for (int i = 0; i < count; i++) { Console.WriteLine(message); } }
会输出传入的消息 count
次。
3. 带返回值的 Lambda 表达式
如果 Lambda 表达式需要返回一个值,它通常会使用单一表达式或一个语句块。
单一表达式的 Lambda 表达式
这种情况下,Lambda 表达式返回一个值,并且可以省略大括号 {}
。
示例
Func<int, int, int> multiply = (x, y) => x * y;
int product = multiply(5, 6); // product = 30
Console.WriteLine(product); // 输出 30
这里,Lambda 表达式 (x, y) => x * y
实现了两个整数的乘法并返回结果。
包含语句块的 Lambda 表达式
如果 Lambda 表达式的功能较为复杂,包含多个语句,则可以使用语句块 {}
来包裹。
示例
Func<int, int, int> addAndPrint = (x, y) =>
{
int sum = x + y;
Console.WriteLine($"The sum is: {sum}");
return sum;
};
int result = addAndPrint(5, 7); // 输出 "The sum is: 12"
Console.WriteLine(result); // 输出 12
在这个例子中,Lambda 表达式 (x, y) => { int sum = x + y; Console.WriteLine($"The sum is: {sum}"); return sum; }
使用了一个语句块来计算 x + y
的和,并打印出结果,最后返回和。
4. 捕获外部变量(闭包)
Lambda 表达式能够访问其定义范围内的外部变量。这是因为 Lambda 表达式在执行时会创建一个闭包,捕获并保留外部变量的引用。
示例
int multiplier = 2;
Func<int, int> multiplyByTwo = x => x * multiplier;
Console.WriteLine(multiplyByTwo(5)); // 输出 10
在上面的例子中,Lambda 表达式访问并使用了外部变量 multiplier
,这个变量的值在 Lambda 表达式定义时被捕获并保存。
5. 参数类型推断
在 Lambda 表达式中,C# 编译器通常可以自动推断参数的类型,因此你不必明确指定参数类型,除非需要明确指定。
示例
Func<int, int, int> add = (a, b) => a + b; // 类型推断
编译器推断 a
和 b
为 int
类型,因为 Func<int, int, int>
指定了参数类型。
如果需要明确指定类型,可能会写成:
Func<int, int, int> add = (int a, int b) => a + b;
总结:Lambda 表达式语法
-
没有参数的 Lambda 表达式:
() => expression
-
带一个参数的 Lambda 表达式:
param => expression
-
带多个参数的 Lambda 表达式:
(param1, param2, ...) => expression
-
带语句块的 Lambda 表达式:
(param1, param2) => { // multiple statements return result; }
-
带返回值的 Lambda 表达式:
(param1, param2) => returnValue
Lambda 表达式的应用场景
- LINQ 查询:Lambda 表达式经常与 LINQ 查询一起使用,提供查询条件、排序等功能。
- 委托和事件处理:Lambda 表达式是匿名方法的简洁替代,特别适用于事件处理、回调和异步编程等场景。
- 集合操作:如在
List<T>.ForEach
、Where
、Select
等操作中使用。
Lambda 表达式极大地简化了代码,使得表达意图更加直接,减少了冗长的代码和繁杂的委托定义。
原文地址:https://blog.csdn.net/weixin_44939430/article/details/144104253
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!