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

相关推荐
阿珊和她的猫10 分钟前
深入理解与手写发布订阅模式
开发语言·前端·javascript·vue.js·ecmascript·状态模式
懷淰メ17 分钟前
python3GUI--模仿百度网盘的本地文件管理器 By:PyQt5(详细分享)
开发语言·python·pyqt·文件管理·百度云·百度网盘·ui设计
向宇it19 分钟前
【unity实战】MapMagic 2实战例子
游戏·3d·unity·c#·游戏引擎
新子y22 分钟前
【小白笔记】普通二叉树(General Binary Tree)和二叉搜索树的最近公共祖先(LCA)
开发语言·笔记·python
"菠萝"38 分钟前
C#知识学习-017(修饰符_6)
学习·c#
重整旗鼓~39 分钟前
28.redisson源码分析分布式锁
java·开发语言
哼?~44 分钟前
C++11标准 上 (万字解析)
开发语言·c++
VB.Net1 小时前
C#循序渐进
开发语言·c#
楼田莉子1 小时前
C++学习:C++11扩展:constexpr特性
开发语言·c++·学习
懒羊羊不懒@1 小时前
Java基础语法—最小单位、及注释
java·c语言·开发语言·数据结构·学习·算法