c# - 什么时候使用闭包?

标签 c# functional-programming closures

<分区>

我已经看到关闭示例来自 - 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/

相关文章:

c# - Xamarin Visual Studio 2017 中缺少 PCL 模板

java - Kotlin 序列 : filter + find first + map

arrays - Swift 中解析 block 的基础知识

javascript - React hooks - 由于关闭而异步 setState 更新旧状态

JavaScript 闭包 - 尝试理解以下代码

c# - iOS 15 更新后 iOS 平台 Xamarin.forms 中的导航栏颜色变化问题

c# - WinForms 单元测试

c# - 证书具有不受支持的关键扩展

scala - Scala 中的哪些类型实现了 flatMap?

java - 如何在 JAVA 中传递静态方法引用?