C#-Lambda

228 阅读2分钟

C# Lambda 表达式书写指南 📝

Lambda 表达式是 C# 中用于简化匿名方法的核心语法,其核心结构为 参数 => 表达式/语句块。以下是其详细书写方式及常见场景:


一、基础结构:参数与运算符

Lambda 表达式由 参数列表=> 运算符和 表达式/语句块 三部分组成: • 参数列表:位于 => 左侧,可以是零或多个参数。 • 运算符=> 读作“goes to”,分隔参数与逻辑。 • 表达式/语句块:右侧为单行表达式(自动返回值)或多行语句块(需显式 return)。

示例

// 表达式形式(单行)
Func<int, int> square = x => x * x; 

// 语句块形式(多行)
Action<string> log = msg => {
    string timestamp = DateTime.Now.ToString();
    Console.WriteLine($"[{timestamp}] {msg}");
};

二、参数处理规则 🎯

  1. 无参数:必须使用空括号 ()

    Action sayHello = () => Console.WriteLine("Hello!");  // 
    
  2. 单参数:括号可省略,类型可推断。

    Func<string, int> getLength = s => s.Length;  // 
    
  3. 多参数:需用逗号分隔,类型可显式声明或推断。

    Func<int, int, bool> equal = (a, b) => a == b;          // 推断类型 
    Func<int, string, bool> check = (int x, string s) => s.Length > x;  // 显式类型 
    
  4. 弃元参数:用 _ 忽略不需要的参数(常见于事件处理)。

    button.Click += (_, e) => Console.WriteLine("点击事件");  // 
    

三、表达式与语句块的区别 📦

  1. 表达式 Lambda
    单行代码,直接返回值,无需 return 关键字:

    Func<int, bool> isEven = x => x % 2 == 0;  // 
    
  2. 语句 Lambda
    多行逻辑需用 {} 包裹,显式使用 return(若有返回值):

    Func<int, int> complexCalc = x => {
        int temp = x * 2;
        return temp + 10;  // 显式返回 
    };
    

四、常见应用场景 🌟

  1. 委托赋值
    直接赋值给 Func(有返回值)或 Action(无返回值):

    Func<int, int, int> add = (a, b) => a + b;  // 
    Action<string> print = s => Console.WriteLine(s);
    
  2. LINQ 查询
    作为条件筛选、转换等逻辑的委托参数:

    var numbers = new[] { 1, 2, 3 };
    var odds = numbers.Where(n => n % 2 == 1);  // 筛选奇数 
    
  3. 事件处理
    简化事件订阅逻辑,支持异步操作:

    button.Click += async (sender, e) => {
        await LoadDataAsync();  // 异步操作 
    };
    
  4. 方法参数
    直接作为参数传递给高阶函数:

    List<int> numbers = new List<int> { 1, 2, 3 };
    numbers.ForEach(n => Console.WriteLine(n));  // 遍历输出 
    

五、注意事项 ⚠️

  1. 类型推断:编译器会根据上下文自动推断参数类型,但复杂场景需显式指定。
  2. 闭包问题:Lambda 捕获外部变量时可能引发闭包副作用(如循环变量捕获)。
  3. 简写规则
    • 参数类型可省略(如 (x, y) => x + y)。 • 单参数可省略括号(如 x => x * x)。 • 单行表达式可省略 {}return

总结 🚀

Lambda 表达式的书写位置灵活,常见于 委托赋值、LINQ 查询、事件处理 等场景。核心原则是:左侧定义参数,右侧编写逻辑。通过合理利用类型推断和简写规则,可大幅提升代码简洁性。