### 1. **Lambda表达式的基础语法**
Lambda表达式是一种简洁的匿名函数表示法,其基本语法为:
```
(parameters) => expression
```
或者,如果需要多条语句:
```
(parameters) => { statements; }
```
- **参数列表**:可以为空(如`()`),也可以包含一个或多个参数。
- **箭头符号**:`=>`,表示参数和表达式之间的映射。
- **表达式或代码块**:可以是一个简单的表达式,也可以是一个包含多条语句的代码块。
### 2. **Lambda表达式的常见用法**
#### 2.1 委托
Lambda表达式可以赋值给委托类型,例如`Func`和`Action`:
```
Func<int, int> square = x => x * x; // 带一个参数的Lambda表达式
Console.WriteLine(square(5)); // 输出 25
Action<string> printMessage = message => Console.WriteLine(message); // Action委托
printMessage("Hello, Lambda!"); // 输出 Hello, Lambda!
```
#### 2.2 LINQ查询
Lambda表达式在LINQ查询中非常常用,用于筛选、排序和转换数据:
```
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0); // 筛选出偶数
```
#### 2.3 事件处理
Lambda表达式可以作为事件处理器,简化事件处理逻辑:
```
button.Click += (sender, e) => Console.WriteLine("Button clicked!");
```
### 3. **Lambda表达式的高级特性**
#### 3.1 异步Lambda表达式
从C# 5.0开始,Lambda表达式可以与`async`和`await`关键字一起使用,支持异步操作:
```
async Task<int> GetResultAsync() => await Task.Run(() => CalculateResult());
```
#### 3.2 表达式树
Lambda表达式可以被转换为表达式树,用于延迟执行或进一步分析:
```
Expression<Func<int, bool>> predicate = x => x > 10;
```
#### 3.3 捕获外部变量
Lambda表达式可以捕获其所在作用域中的变量,形成闭包:
```
int multiplier = 3;
Func<int, int> multiply = x => x * multiplier;
Console.WriteLine(multiply(10)); // 输出 30
```
### 4. **注意事项**
- Lambda表达式可以捕获外部变量,但需要注意变量的作用域和生命周期。
- 在多线程环境中,捕获的变量可能会导致意外的行为。
### 5. **总结**
Lambda表达式是C#中一种非常强大的特性,能够简化代码、提高可读性,并支持函数式编程风格。它广泛应用于委托、LINQ查询、事件处理和异步编程等场景。