【问题标题】:C# -Closure -ClarificationC# -Closure -Clarification
【发布时间】:2011-02-01 11:38:03
【问题描述】:

我正在学习 C#。我的意思是 a construct that can adopt the changes in the environment in which it is defined. 的闭包

例子:

List<Person> gurus = 
new List<Person>()
                 {
                  new Person{id=1,Name="Jon Skeet"},
                  new Person{id=2,Name="Marc Gravell"},
                  new Person{id=3,Name="Lasse"}
                 };            


void FindPersonByID(int id)
{
  gurus.FindAll(delegate(Person x) { return x.id == id; }); 
}

变量id 声明在 FindPersonByID() 的范围内,但我们仍然可以访问 匿名函数内的局部变量id(即)delegate(Person x) { return x.id == id; }

(1) 我对闭包的理解是否正确?

(2) 我们可以从闭包中获得哪些优势?

【问题讨论】:

标签: c# linq closures anonymous-methods


【解决方案1】:

是的,FindPersonByID 内部的代码通过在 lambda 表达式中使用参数 id 来利用闭包。严格来说,闭包的定义有点复杂,但在基本层面上这是正确的。如果您想了解更多关于它们如何运作的信息,我鼓励您阅读以下文章

闭包的主要优势本质上就是您在上面所展示的。它允许您以更自然、更直接的方式编写代码,而不必担心(通常)如何生成 lambda 表达式的实现细节

例如,考虑一下在没有闭包的情况下您需要编写多少代码

class Helper {
  private int _id;
  public Helper(int id) { 
    _id = id;
  }
  public bool Filter(Person p) {
    return p.id == _id;
  }
}

void FindPersonsByID(int id) {
  Helper helper = new Helper(id);
  gurus.FindAll(helper.Filter);
}

所有这些只是为了表达在委托中使用参数的概念。

【讨论】:

  • jaredpar 先生很好的解释
猜你喜欢
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 2023-02-04
  • 2015-06-28
  • 2016-02-23
  • 2014-10-15
相关资源
最近更新 更多