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 查询中非常有用,尤其是在使用 Where
、Select
、OrderBy
等方法时。
var evenNumbers = numbers.Where(n => n % 2 == 0);
高级用法
表达式树
Lambda 表达式可以被转换成表达式树,这是一种数据结构,表示代码中的表达式。
代码语言:javascript复制Expression<Func<int, bool>> predicate = x => x > 10;
表达式树在编译时不会执行,而是可以被进一步分析或转换为其他形式,例如 SQL 查询。
异步 Lambda 表达式
在 C# 5.0 之后,Lambda 表达式可以与 async
和 await
关键字一起使用,以支持异步操作。
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);