1. C# 匿名方法与 Lambda 表达式核心概念解析
在C#开发中,我们经常会遇到需要传递代码块作为参数的场景。传统做法是定义一个完整的方法,但这会导致代码结构松散,特别是对于只使用一次的简单逻辑。匿名方法和Lambda表达式正是为解决这类问题而生。
1.1 委托:匿名方法与Lambda的基础
理解匿名方法和Lambda表达式之前,必须先掌握委托(Delegate)的概念。委托本质上是一种类型安全的函数指针,它定义了方法的签名(参数类型和返回类型),可以引用任何与其签名匹配的方法。
csharp复制// 定义一个委托类型
public delegate void ProcessNumber(int number);
// 传统命名方法
void PrintNumber(int num)
{
Console.WriteLine($"Number: {num}");
}
// 使用委托
ProcessNumber processor = PrintNumber;
processor(42); // 输出: Number: 42
委托的强大之处在于它可以将方法作为参数传递,这是实现回调机制的基础。但每次都要定义完整的方法显然不够灵活,这就引出了匿名方法的需求。
1.2 匿名方法的诞生与演进
C# 2.0引入了匿名方法,允许开发者在需要委托的地方直接内联定义方法体,无需单独声明方法。这种语法特别适合那些只使用一次的简单逻辑。
csharp复制ProcessNumber anonymousProcessor = delegate(int num)
{
Console.WriteLine($"Anonymous: {num * 2}");
};
anonymousProcessor(42); // 输出: Anonymous: 84
匿名方法有几个关键特点:
- 使用
delegate关键字定义 - 可以省略参数类型(编译器能推断)
- 可以访问定义范围内的外部变量(闭包)
- 方法体可以是语句块或单个表达式
实际开发中发现:匿名方法在早期C#版本中非常有用,但随着Lambda表达式的出现,其使用场景已经大大减少。但在某些需要明确指定参数类型的复杂场景中,匿名方法仍然有其价值。
1.3 Lambda表达式的革命性改进
C# 3.0引入了Lambda表达式,这是对匿名方法的进一步简化和功能增强。Lambda表达式不仅语法更简洁,还与LINQ深度集成,成为现代C#开发的核心特性之一。
csharp复制// 等效的Lambda表达式
ProcessNumber lambdaProcessor = num => Console.WriteLine($"Lambda: {num / 2}");
lambdaProcessor(42); // 输出: Lambda: 21
Lambda表达式的基本语法有两种形式:
- 表达式Lambda:(参数) => 表达式
