【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 表达式极大地简化了代码,使得表达意图更加直接,减少了冗长的代码和繁杂的委托定义。

相关推荐
mudtools2 小时前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
c#·.net
侃侃_天下8 小时前
最终的信号类
开发语言·c++·算法
echoarts8 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix8 小时前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
大飞pkz8 小时前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式
每天回答3个问题9 小时前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说9 小时前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔10 小时前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
我是菜鸟0713号10 小时前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_10 小时前
QT(4)
开发语言·汇编·c++·qt·算法