【C#】lambda , lambda 表达式语法

Lambda 表达式是 C# 中一种非常简洁且强大的语法结构,它允许你定义匿名方法。简而言之,Lambda 表达式可以看作是一个简化的匿名方法或者匿名函数。

Lambda 表达式基础

Lambda 表达式的语法可以用于定义函数、委托、事件等,并且通常比传统的匿名方法更简洁。其基本语法形式如下:

csharp 复制代码
(parameters) => expression_or_statement_block

语法分解

  • parameters:参数列表,可以为空或包含多个参数。
  • =>:Lambda 运算符,用于分隔参数和方法体。
  • expression_or_statement_block:可以是一个表达式(当 Lambda 返回值时)或者是一个语句块(当 Lambda 是一个复杂方法时)。

1. 不带参数的 Lambda 表达式

如果 Lambda 表达式不需要参数,可以省略参数列表,直接使用 () 表示。

语法
csharp 复制代码
() => expression
示例
csharp 复制代码
Action sayHello = () => Console.WriteLine("Hello, World!");
sayHello(); // 输出 "Hello, World!"

这里的 Action 是一个不返回值的委托类型(即返回类型是 void)。Lambda 表达式 () => Console.WriteLine("Hello, World!") 相当于一个没有参数、执行 Console.WriteLine("Hello, World!") 的方法。

2. 带参数的 Lambda 表达式

Lambda 表达式可以带有参数,参数列表类似于方法的参数列表。

语法
csharp 复制代码
(parameters) => expression_or_statement_block
示例
csharp 复制代码
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 定义了一个方法,该方法接受两个参数 ab,并返回它们的和。

带有多个参数的 Lambda 表达式

Lambda 表达式可以有多个参数,多个参数之间用逗号分隔。

示例
csharp 复制代码
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 表达式返回一个值,并且可以省略大括号 {}

示例
csharp 复制代码
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 表达式的功能较为复杂,包含多个语句,则可以使用语句块 {} 来包裹。

示例
csharp 复制代码
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 表达式在执行时会创建一个闭包,捕获并保留外部变量的引用。

示例
csharp 复制代码
int multiplier = 2;
Func<int, int> multiplyByTwo = x => x * multiplier;
Console.WriteLine(multiplyByTwo(5)); // 输出 10

在上面的例子中,Lambda 表达式访问并使用了外部变量 multiplier,这个变量的值在 Lambda 表达式定义时被捕获并保存。


5. 参数类型推断

在 Lambda 表达式中,C# 编译器通常可以自动推断参数的类型,因此你不必明确指定参数类型,除非需要明确指定。

示例
csharp 复制代码
Func<int, int, int> add = (a, b) => a + b; // 类型推断

编译器推断 abint 类型,因为 Func<int, int, int> 指定了参数类型。

如果需要明确指定类型,可能会写成:

csharp 复制代码
Func<int, int, int> add = (int a, int b) => a + b;

总结:Lambda 表达式语法

  1. 没有参数的 Lambda 表达式:

    csharp 复制代码
    () => expression
  2. 带一个参数的 Lambda 表达式:

    csharp 复制代码
    param => expression
  3. 带多个参数的 Lambda 表达式:

    csharp 复制代码
    (param1, param2, ...) => expression
  4. 带语句块的 Lambda 表达式:

    csharp 复制代码
    (param1, param2) => 
    {
        // multiple statements
        return result;
    }
  5. 带返回值的 Lambda 表达式:

    csharp 复制代码
    (param1, param2) => returnValue

Lambda 表达式的应用场景

  • LINQ 查询:Lambda 表达式经常与 LINQ 查询一起使用,提供查询条件、排序等功能。
  • 委托和事件处理:Lambda 表达式是匿名方法的简洁替代,特别适用于事件处理、回调和异步编程等场景。
  • 集合操作 :如在 List<T>.ForEachWhereSelect 等操作中使用。

Lambda 表达式极大地简化了代码,使得表达意图更加直接,减少了冗长的代码和繁杂的委托定义。

相关推荐
isyangli_blog8 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008118 小时前
FastAPI APIRouter
开发语言·python
Benszen8 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆8 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木8 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充9 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~9 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball6169 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
春生野草9 小时前
反射、Tomcat执行
java·开发语言
雪的季节10 小时前
企业级 Qt 全功能项目
开发语言·数据库·qt