Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 6.3 匿名方法与Lambda表达式

6.3 匿名方法与Lambda表达式

概述

匿名方法和Lambda表达式是C#中简化委托使用的两种重要语法特性。它们允许开发者以更简洁的方式定义内联方法,无需显式声明具名方法,特别适用于事件处理和LINQ查询等场景。

匿名方法

基本语法

delegate(parameters) { 
    // 方法体 
};

特点

  1. 通过delegate关键字声明
  2. 可省略参数列表(当委托类型明确时)
  3. 必须包含方法体
  4. 可以访问外部变量(形成闭包)

示例

// 传统委托
Button.Click += new EventHandler(Button_Click);

void Button_Click(object sender, EventArgs e) {
    MessageBox.Show("Clicked!");
}

// 匿名方法
Button.Click += delegate(object sender, EventArgs e) {
    MessageBox.Show("Clicked!");
};

Lambda表达式

进化历程

匿名方法 → Lambda表达式 → 表达式Lambda

语法形式

  1. 完整形式:(input-parameters) => { statements; }
  2. 表达式形式:(input-parameters) => expression

特点

  1. 使用=>运算符(读作"goes to")
  2. 参数类型可推断时可省略类型声明
  3. 单参数时可省略括号
  4. 方法体为单条语句时可省略大括号

示例

// 完整Lambda
Button.Click += (object sender, EventArgs e) => {
    MessageBox.Show("Clicked!");
};

// 简化Lambda
Button.Click += (sender, e) => MessageBox.Show("Clicked!");

// LINQ中的Lambda
var result = numbers.Where(x => x > 5).OrderBy(x => x);

对比与选择

特性匿名方法Lambda表达式
语法复杂度中等简洁
类型推断有限支持完全支持
表达式体不支持支持
弃元参数(_)不支持C# 9.0+支持
适用场景需要兼容旧版C#(2.0)时使用现代C#代码首选

高级用法

闭包现象

int factor = 2;
Func<int, int> multiplier = x => x * factor;
factor = 10;
Console.WriteLine(multiplier(5));  // 输出50而非10

表达式树

Expression<Func<int, bool>> expr = x => x > 5;
var compiled = expr.Compile();
Console.WriteLine(compiled(10));  // 输出True

注意事项

  1. 避免在循环中创建Lambda表达式(可能导致意外闭包)
  2. 注意多线程环境下的变量捕获
  3. 复杂的Lambda表达式应考虑重构为具名方法
  4. 调试时Lambda表达式会显示为<>c__DisplayClass#

最佳实践

  1. 优先使用Lambda表达式而非匿名方法
  2. 保持Lambda表达式简短(不超过3-5行)
  3. 对复杂逻辑使用具名方法
  4. 注意代码可读性,必要时添加注释

练习题

  1. 将以下匿名方法转换为Lambda表达式:

    delegate(int x) { return x * x; }
    
  2. 编写一个Lambda表达式,过滤出字符串列表中长度大于5的元素

  3. 解释以下代码的输出结果:

    var actions = new List<Action>();
    for (int i = 0; i < 3; i++)
    {
        actions.Add(() => Console.WriteLine(i));
    }
    foreach (var action in actions)
    {
        action();
    }
    

下一节:第7章 文件与数据处理 →

Last Updated:: 5/3/25, 11:01 PM