C#的 Lambda 表达式

2024-10-09 21:40:30 浏览数 (3)

Lambda 表达式是 C# 语言中一种非常强大的特性,它允许开发者以简洁的方式表示匿名函数。自 C# 3.0 发布以来,Lambda 表达式已经成为编写清晰、可读且功能强大的代码的关键工具。本文将深入探讨 Lambda 表达式的基本概念、语法、应用场景以及在现代 C# 开发中的一些高级用法。

什么是 Lambda 表达式?

Lambda 表达式是一种匿名函数,即没有名称的函数。它允许你将函数作为方法的参数传递,或者在需要时创建函数对象。Lambda 表达式通常用于委托、表达式树和 LINQ 查询。

Lambda 表达式的语法

Lambda 表达式的一般形式如下:

代码语言:javascript复制
(input parameters) => expression

或者,如果需要多条语句:

代码语言:javascript复制
(input parameters) => { statement block }

参数

Lambda 表达式可以有零个或多个参数。参数可以是输入参数,也可以是输出参数(例如,用于 LINQ 查询)。

表达式与语句块

Lambda 表达式可以返回一个表达式的结果,也可以包含一个语句块。如果 Lambda 表达式只包含一个表达式,它会隐式返回该表达式的结果。如果包含多个语句,必须显式返回一个值。

Lambda 表达式的应用

委托

委托是 C# 中定义的类型,它定义了方法的类型。Lambda 表达式可以赋值给委托类型的变量。

代码语言:javascript复制
Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 输出 25

事件

Lambda 表达式可以用于订阅事件。

代码语言:javascript复制
button.Click  = (sender, e) => Console.WriteLine("Button clicked!");

LINQ 查询

Lambda 表达式在 LINQ 查询中非常有用,尤其是在使用 WhereSelectOrderBy 等方法时。

代码语言:javascript复制
var evenNumbers = numbers.Where(n => n % 2 == 0);

高级用法

表达式树

Lambda 表达式可以被转换成表达式树,这是一种数据结构,表示代码中的表达式。

代码语言:javascript复制
Expression<Func<int, bool>> predicate = x => x > 10;

表达式树在编译时不会执行,而是可以被进一步分析或转换为其他形式,例如 SQL 查询。

异步 Lambda 表达式

在 C# 5.0 之后,Lambda 表达式可以与 asyncawait 关键字一起使用,以支持异步操作。

代码语言:javascript复制
async Task<int> GetResultAsync() => await Task.Run(() => CalculateResult());

局部函数

在 C# 7.0 中引入的局部函数允许在 Lambda 表达式中定义局部函数。

代码语言:javascript复制
Func<int, int> square = x =>
{
    int ComputeSquare(int y) => y * y;
    return ComputeSquare(x);
};

可空引用类型

在 C# 8.0 中引入的可空引用类型特性与 Lambda 表达式结合使用,可以提高代码的安全性。

代码语言:javascript复制
Func<string?, bool> isNullOrEmpty = s => string.IsNullOrEmpty(s);

0 人点赞