gpt4 book ai didi

C# - 关闭 - 澄清

转载 作者:太空狗 更新时间:2023-10-29 17:54:22 27 4
gpt4 key购买 nike

我正在学习 C#。我可以将闭包理解为一种可以适应其定义环境中的变化的结构吗。

示例:

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) 我们可以从闭包中得到什么好处?

最佳答案

是的,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);
}

所有这些只是为了表达在委托(delegate)内部使用参数的概念。

关于C# - 关闭 - 澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2528603/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com