自学内容网 自学内容网

【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 定义了一个方法,该方法接受两个参数 ab,并返回它们的和。

带有多个参数的 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; // 类型推断

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

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

Func<int, int, int> add = (int a, int b) => a + b;

总结:Lambda 表达式语法

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

    () => expression
    
  2. 带一个参数的 Lambda 表达式:

    param => expression
    
  3. 带多个参数的 Lambda 表达式:

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

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

    (param1, param2) => returnValue
    

Lambda 表达式的应用场景

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

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


原文地址:https://blog.csdn.net/weixin_44939430/article/details/144104253

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!