C#-Closure -Clarification
我正在学习C#。可以说,闭包是a construct that can adopt the changes in the environment in which it is defined.
示例:
List gurus = new List() { 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; }
delegate(Person x) { return x.id == id; }
(1)我对闭合的理解是否正确?
(2)我们可以从封闭中获得哪些优势?
是的, FindPersonByID
的代码通过使用lambda表达式中的参数id
来利用闭包。 严格来说,闭包的定义有点复杂,但在基本层面上这是正确的。 如果您想了解更多关于它们如何运作的信息,我建议您阅读以下文章
- http://csharpindepth.com/Articles/Chapter5/Closures.aspx
- http://blogs.msdn.com/jaredpar/archive/tags/Closures/default.aspx
闭包的主要优点基本上就是您在上面演示的内容。 它允许您以更自然,直接的方式编写代码,而不必担心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); }
所有这些只是为了表达在委托中使用参数的概念。