<分区>
我已经看到关闭示例来自 - What is a 'Closure'?
谁能提供何时使用闭包的简单示例?
具体来说,闭包有意义的场景?
假设该语言不支持闭包,如何实现类似的事情?
为了不冒犯任何人,请用 c#、python、javascript、ruby 等语言发布代码示例。
对不起,我还不懂函数式语言。
<分区>
我已经看到关闭示例来自 - What is a 'Closure'?
谁能提供何时使用闭包的简单示例?
具体来说,闭包有意义的场景?
假设该语言不支持闭包,如何实现类似的事情?
为了不冒犯任何人,请用 c#、python、javascript、ruby 等语言发布代码示例。
对不起,我还不懂函数式语言。
最佳答案
闭包是非常棒的工具。什么时候使用它们?任何时候你喜欢... 正如已经说过的,另一种方法是编写一个类;例如,在 C# 2.0 之前,创建一个参数化线程是一场真正的斗争。使用 C# 2.0,您甚至不需要您只需执行的“ParameterizedThreadStart”:
string name = // blah
int value = // blah
new Thread((ThreadStart)delegate { DoWork(name, value);}); // or inline if short
将其与创建具有名称和值的类进行比较
或者类似地搜索列表(这次使用 lambda):
Person person = list.Find(x=>x.Age > minAge && x.Region == region);
同样 - 另一种方法是编写一个具有两个属性和一个方法的类:
internal sealed class PersonFinder
{
public PersonFinder(int minAge, string region)
{
this.minAge = minAge;
this.region = region;
}
private readonly int minAge;
private readonly string region;
public bool IsMatch(Person person)
{
return person.Age > minAge && person.Region == region;
}
}
...
Person person = list.Find(new PersonFinder(minAge,region).IsMatch);
这与编译器在引擎盖下的工作方式相当(实际上,它使用公共(public)读/写字段,而不是私有(private)只读)。
C# 捕获的最大警告是观察范围;例如:
for(int i = 0 ; i < 10 ; i++) {
ThreadPool.QueueUserWorkItem(delegate
{
Console.WriteLine(i);
});
}
这可能不会打印出您期望的结果,因为每个变量都使用了变量 i。你可以看到任何重复的组合——甚至是 10 个 10。您需要在 C# 中仔细限定捕获变量的范围:
for(int i = 0 ; i < 10 ; i++) {
int j = i;
ThreadPool.QueueUserWorkItem(delegate
{
Console.WriteLine(j);
});
}
这里每个 j 被单独捕获(即不同的编译器生成的类实例)。
Jon Skeet 有一篇很好的博客文章,涵盖了 C# 和 java 闭包 here ;或有关更多详细信息,请参阅他的书 C# in Depth ,有一整章介绍它们。
关于c# - 什么时候使用闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/256625/