C# 中什么是闭包 (closure)?

· 约 3 分钟读完 · 第 19 / 183 章

推荐答案

在 C# 中,闭包(closure)是指一个函数(或匿名方法、Lambda 表达式)捕获并保存了其外部作用域中的变量,即使外部作用域已经结束,闭包仍然可以访问和操作这些变量。闭包通常用于在函数内部保留对外部变量的引用,从而实现更灵活的编程模式。

在上面的例子中,closure 是一个闭包,它捕获了外部变量 x。即使 x 的值在闭包定义后被修改,闭包仍然能够访问并输出最新的值。

本题详细解读

闭包的定义

闭包是指一个函数(或匿名方法、Lambda 表达式)与其引用的外部变量环境的组合。闭包允许函数访问并操作其词法作用域中的变量,即使这些变量在其原始作用域中已经不再存在。

闭包的工作原理

在 C# 中,闭包是通过编译器生成的一个隐藏类来实现的。当编译器检测到一个函数捕获了外部变量时,它会将这些变量“提升”到一个编译器生成的类中,并将该类的实例传递给闭包函数。这样,闭包函数就可以通过这个实例访问外部变量。

闭包的应用场景

  1. 回调函数:闭包常用于回调函数中,允许回调函数访问创建时的上下文。
  2. 延迟执行:闭包可以用于延迟执行某些操作,直到特定的条件满足。
  3. 函数工厂:闭包可以用于创建返回函数的函数,这些返回的函数可以访问创建时的变量。

注意事项

  • 内存泄漏:由于闭包会保留对外部变量的引用,可能会导致意外的内存泄漏,特别是在长时间运行的应用程序中。
  • 性能开销:闭包会引入额外的内存和性能开销,因为编译器需要生成额外的类来存储捕获的变量。

示例代码

在这个例子中,CreateCounter 函数返回一个闭包,该闭包捕获了 count 变量。每次调用 counter 时,count 的值都会递增,并且闭包会记住 count 的最新值。