C# Lambda 表达式书写指南 📝
Lambda 表达式是 C# 中用于简化匿名方法的核心语法,其核心结构为 参数 => 表达式/语句块
。以下是其详细书写方式及常见场景:
一、基础结构:参数与运算符
Lambda 表达式由 参数列表 、=>
运算符和 表达式/语句块 三部分组成: • 参数列表 :位于 =>
左侧,可以是零或多个参数。 • 运算符 :=>
读作"goes to",分隔参数与逻辑。 • 表达式/语句块 :右侧为单行表达式(自动返回值)或多行语句块(需显式 return
)。
示例:
csharp
// 表达式形式(单行)
Func<int, int> square = x => x * x;
// 语句块形式(多行)
Action<string> log = msg => {
string timestamp = DateTime.Now.ToString();
Console.WriteLine($"[{timestamp}] {msg}");
};
二、参数处理规则 🎯
-
无参数 :必须使用空括号
()
。csharpAction sayHello = () => Console.WriteLine("Hello!"); //
-
单参数:括号可省略,类型可推断。
csharpFunc<string, int> getLength = s => s.Length; //
-
多参数:需用逗号分隔,类型可显式声明或推断。
csharpFunc<int, int, bool> equal = (a, b) => a == b; // 推断类型 Func<int, string, bool> check = (int x, string s) => s.Length > x; // 显式类型
-
弃元参数 :用
_
忽略不需要的参数(常见于事件处理)。csharpbutton.Click += (_, e) => Console.WriteLine("点击事件"); //
三、表达式与语句块的区别 📦
-
表达式 Lambda
单行代码,直接返回值,无需
return
关键字:csharpFunc<int, bool> isEven = x => x % 2 == 0; //
-
语句 Lambda
多行逻辑需用
{}
包裹,显式使用return
(若有返回值):csharpFunc<int, int> complexCalc = x => { int temp = x * 2; return temp + 10; // 显式返回 };
四、常见应用场景 🌟
-
委托赋值
直接赋值给
Func
(有返回值)或Action
(无返回值):csharpFunc<int, int, int> add = (a, b) => a + b; // Action<string> print = s => Console.WriteLine(s);
-
LINQ 查询
作为条件筛选、转换等逻辑的委托参数:
csharpvar numbers = new[] { 1, 2, 3 }; var odds = numbers.Where(n => n % 2 == 1); // 筛选奇数
-
事件处理
简化事件订阅逻辑,支持异步操作:
csharpbutton.Click += async (sender, e) => { await LoadDataAsync(); // 异步操作 };
-
方法参数
直接作为参数传递给高阶函数:
csharpList<int> numbers = new List<int> { 1, 2, 3 }; numbers.ForEach(n => Console.WriteLine(n)); // 遍历输出
五、注意事项 ⚠️
- 类型推断:编译器会根据上下文自动推断参数类型,但复杂场景需显式指定。
- 闭包问题:Lambda 捕获外部变量时可能引发闭包副作用(如循环变量捕获)。
- 简写规则 :
• 参数类型可省略(如(x, y) => x + y
)。 • 单参数可省略括号(如x => x * x
)。 • 单行表达式可省略{}
和return
。
总结 🚀
Lambda 表达式的书写位置灵活,常见于 委托赋值、LINQ 查询、事件处理 等场景。核心原则是:左侧定义参数,右侧编写逻辑。通过合理利用类型推断和简写规则,可大幅提升代码简洁性。尝试在项目中用 Lambda 替换传统循环或匿名方法,体验其高效与优雅!