C Sharp Lambda 语法
外观
C# Lambda语法[编辑 | 编辑源代码]
Lambda表达式是C#中一种简洁的匿名函数表示方式,它允许开发者以更紧凑的语法编写代码。Lambda表达式在C# 3.0中引入,主要用于简化委托和LINQ查询的编写。
基本概念[编辑 | 编辑源代码]
Lambda表达式的基本语法形式为:
其中:
- input parameters:表示Lambda表达式的输入参数
- =>:Lambda运算符,读作"goes to"
- expression:表达式或语句块
Lambda表达式可以转换为以下两种委托类型:
- Action:无返回值的委托
- Func:有返回值的委托
基本语法示例[编辑 | 编辑源代码]
以下是一个简单的Lambda表达式示例:
// 使用Lambda表达式定义一个简单的加法函数
Func<int, int, int> add = (x, y) => x + y;
// 调用Lambda表达式
int result = add(5, 3); // 输出: 8
Console.WriteLine(result);
Lambda表达式的多种形式[编辑 | 编辑源代码]
无参数Lambda[编辑 | 编辑源代码]
Action greet = () => Console.WriteLine("Hello, World!");
greet(); // 输出: Hello, World!
单参数Lambda[编辑 | 编辑源代码]
Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 输出: 25
多参数Lambda[编辑 | 编辑源代码]
Func<int, int, bool> isEqual = (x, y) => x == y;
Console.WriteLine(isEqual(5, 5)); // 输出: True
语句Lambda[编辑 | 编辑源代码]
当需要执行多个语句时,可以使用花括号:
Action<string> greetName = name =>
{
string greeting = $"Hello, {name}!";
Console.WriteLine(greeting);
};
greetName("Alice"); // 输出: Hello, Alice!
Lambda表达式与委托[编辑 | 编辑源代码]
Lambda表达式通常与委托一起使用。以下示例展示了如何使用Lambda表达式作为委托参数:
// 定义一个接受委托作为参数的方法
void ProcessNumbers(int[] numbers, Func<int, bool> filter)
{
foreach (var num in numbers)
{
if (filter(num))
{
Console.WriteLine(num);
}
}
}
// 使用Lambda表达式调用方法
int[] nums = { 1, 2, 3, 4, 5, 6 };
ProcessNumbers(nums, n => n % 2 == 0); // 输出所有偶数: 2, 4, 6
Lambda表达式与LINQ[编辑 | 编辑源代码]
Lambda表达式在LINQ查询中广泛使用:
List<string> names = new List<string> { "Alice", "Bob", "Charlie", "Dave" };
// 使用Lambda表达式筛选和排序
var result = names
.Where(name => name.Length > 3)
.OrderBy(name => name)
.Select(name => name.ToUpper());
foreach (var name in result)
{
Console.WriteLine(name); // 输出: ALICE, CHARLIE, DAVE
}
捕获外部变量[编辑 | 编辑源代码]
Lambda表达式可以捕获其外部作用域中的变量:
int factor = 2;
Func<int, int> multiplier = n => n * factor;
Console.WriteLine(multiplier(5)); // 输出: 10
// 修改捕获的变量
factor = 3;
Console.WriteLine(multiplier(5)); // 输出: 15
实际应用案例[编辑 | 编辑源代码]
事件处理[编辑 | 编辑源代码]
Lambda表达式可以简化事件处理程序的编写:
Button button = new Button();
button.Text = "Click Me";
// 使用Lambda表达式订阅事件
button.Click += (sender, e) =>
{
MessageBox.Show("Button was clicked!");
};
异步编程[编辑 | 编辑源代码]
Lambda表达式在异步编程中也非常有用:
// 使用Lambda表达式定义异步方法
Task.Run(() =>
{
// 模拟长时间运行的任务
Thread.Sleep(1000);
Console.WriteLine("Task completed!");
});
Console.WriteLine("Task started..."); // 立即输出
性能考虑[编辑 | 编辑源代码]
虽然Lambda表达式提供了编码便利性,但需要注意:
- 每次执行Lambda表达式时都可能创建新的委托实例
- 捕获外部变量会导致编译器生成额外的类
- 在性能关键代码中,可能需要考虑使用命名方法
高级主题[编辑 | 编辑源代码]
表达式树[编辑 | 编辑源代码]
Lambda表达式可以转换为表达式树,这在LINQ to SQL等场景中非常有用:
Expression<Func<int, bool>> isEvenExpression = num => num % 2 == 0;
闭包[编辑 | 编辑源代码]
Lambda表达式捕获变量时创建闭包,理解这一点很重要:
List<Action> actions = new List<Action>();
for (int i = 0; i < 3; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var action in actions)
{
action(); // 输出: 3, 3, 3 (不是预期的0,1,2)
}
要解决这个问题,需要在循环内创建局部变量:
for (int i = 0; i < 3; i++)
{
int temp = i;
actions.Add(() => Console.WriteLine(temp)); // 现在输出: 0,1,2
}
总结[编辑 | 编辑源代码]
Lambda表达式是C#中强大的功能,它:
- 提供了简洁的匿名函数语法
- 与委托和LINQ完美集成
- 可以捕获外部变量形成闭包
- 在事件处理和异步编程中特别有用
掌握Lambda表达式可以显著提高代码的可读性和开发效率。