我正在学习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)我们可以从闭包中获得哪些优势?
答案 0 :(得分:6)
是的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);
}
所有这些只是为了表达在委托中使用参数的概念。