请解释 C# 中闭包的概念,并阐述如何通过委托和匿名方法实现闭包。
考察说明
考查对闭包概念及 C# 中委托和匿名方法捕获变量的理解。
回答思路
- 【回答框架 1】闭包是指一个函数与其捕获的外部变量组成的整体。在 C# 中,当匿名方法或 Lambda 表达式引用其外部作用域的变量时,编译器会生成一个闭包类实例来存储这些变量,使它们即使在外部方法返回后仍可被访问。
- 【回答框架 2】委托是方法的安全封装,可指向静态或实例方法。匿名方法是一种内联定义委托的方式,语法为 delegate (参数) { ... },它们可以访问定义处的外围作用域中的局部变量和参数,这正是闭包的体现。
- 【回答框架 3】例如,int factor = 2; Func<int,int> multiply = x => x * factor; 这里 factor 被捕获,即使定义作用域结束后,multiply 调用时仍能读取 factor 的值。
- 【回答框架 4】注意 C# 闭包是引用捕获而非值捕获,即捕获的是变量本身,而非其快照。若变量在循环中变化,闭包可能观察到最新值,这与某些语言不同,需结合具体场景理解。
- 【关键点 1】闭包允许匿名方法和 Lambda 捕获并保留外部变量,即使外部方法已返回。
- 【关键点 2】C# 编译器通过为捕获的变量生成隐藏类实现闭包,并按引用捕获。
- 【关键点 3】委托与匿名方法是闭包的常见载体,如 Action 和 Func 类型。
- 【易错点 1】闭包捕获的是变量引用而非值,循环变量陷阱需注意,但 C# 5 后 foreach 已改为每次迭代新变量。
- 【易错点 2】过度使用闭包可能造成内存泄漏,因委托长期持有捕获对象,需注意生命周期。