何时使用闭包的场景

3

我已经在C#中玩过闭包,甚至在生产级别的应用中编写了它们,但是,没有什么事情真正地告诉我这个问题 必须 或者只能使用闭包来解决。

是否有任何问题可以特别适用于使用闭包来解决?另外,在C# 4.0中使用闭包时有什么需要注意的问题吗?

谢谢

1个回答

6
考虑到闭包是编译器功能而不是平台功能,因此没有什么是不能用它们完成的。
您可以手动编写编译器使用的所有代码(好吧,在涉及表达式树时有一些例外情况,并且编译器可以访问某些语言未公开的IL指令)。
但是,在需要访问封闭变量的LINQ中不使用闭包是疯狂的。例如:
public List<Person> FilterByAge(IEnumerable<Person> people, int age)
{
    return people.Where(p => p.Age >= age).ToList();
}

那个 lambda 表达式是一个闭包,从委托中访问 age。
至于需要注意的事项:

1
闭包有什么性能优势吗?另外,为什么不在LINQ中使用闭包会让我很生气?虽然,我猜想在那个代码示例的要求下,没有其他真正的方法来访问封闭变量。 - GurdeepS
2
@dotnetdev:另一种选择是创建一堆额外的类,就像编译器所做的那样。再见了,可读性。当然,性能是相同的,因为它是相同的代码。 - Jon Skeet
明白了,谢谢。我想闭包是显而易见的选择。 - GurdeepS
闭包的另一个选择是使用标准循环(例如这里的示例:http://joe.truemesh.com/blog/000390.html)。无论哪种方式,闭包中的代码更加简洁,但年轻的程序员并不真正理解它(这只是一种观察,没有技术上的错误)。 - GurdeepS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接