什么是.NET中的“闭包”?

什么是封闭? 我们有.NET吗?


如果他们确实存在于.NET中,您能否提供一个代码片段(最好在C#中)解释它?


编辑:我经历了Jon Skeet的文章,了解什么是闭包,以及如何在.NET中使用它们。


我有一篇关于这个话题的文章。 (它有很多例子。)

实质上,闭包是一段代码,它可以在稍后执行,但它保留了它最初创建的环境,即它仍然可以使用创建它的方法的局部变量等,即使在那之后方法已经完成执行。

闭包的一般特征在C#中由匿名方法和lambda表达式实现。

以下是使用匿名方法的示例:

using System;

class Test
{
    static void Main()
    {
        Action action = CreateAction();
        action();
        action();
    }

    static Action CreateAction()
    {
        int counter = 0;
        return delegate
        {
            // Yes, it could be done in one statement; 
            // but it is clearer like this.
            counter++;
            Console.WriteLine("counter={0}", counter);
        };
    }
}

输出:

counter=1
counter=2

在这里我们可以看到,由CreateAction返回的操作仍然可以访问计数器变量,并且确实可以增加它,即使CreateAction本身已经完成。


如果您有兴趣了解C#如何实现Closure,请阅读“我知道答案(其42)博客”

编译器在后台生成一个类来封装这个匿名方法和变量j

[CompilerGenerated]
private sealed class <>c__DisplayClass2
{
    public <>c__DisplayClass2();
    public void <fillFunc>b__0()
    {
       Console.Write("{0} ", this.j);
    }
    public int j;
}

功能:

static void fillFunc(int count) {
    for (int i = 0; i < count; i++)
    {
        int j = i;
        funcArr[i] = delegate()
                     {
                         Console.Write("{0} ", j);
                     };
    } 
}

把它变成:

private static void fillFunc(int count)
{
    for (int i = 0; i < count; i++)
    {
        Program.<>c__DisplayClass1 class1 = new Program.<>c__DisplayClass1();
        class1.j = i;
        Program.funcArr[i] = new Func(class1.<fillFunc>b__0);
    }
}

闭包是功能值,它们保存来自其原始范围的变量值。 C#可以以匿名代表的形式使用它们。

举一个非常简单的例子,使用这个C#代码:

    delegate int testDel();

    static void Main(string[] args)
    {
        int foo = 4;
        testDel myClosure = delegate()
        {
            return foo;
        };
        int bar = myClosure();

    }

在它的最后,bar将被设置为4,并且myClosure委托可以被传递以用于程序中的其他地方。

闭包可用于许多有用的事情,如延迟执行或简化接口 - LINQ主要是使用闭包构建的。 对于大多数开发人员来说,最直接的方式是将事件处理程序添加到动态创建的控件中 - 您可以使用闭包在控件实例化时添加行为,而不是将数据存储在别处。

链接地址: http://www.djcxy.com/p/1447.html

上一篇: What are 'closures' in .NET?

下一篇: How do I show the changes which have been staged?