首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.NET中的“闭包”是什么?

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

Stack Overflow用户
提问于 2009-01-09 16:01:26
回答 12查看 46.6K关注 0票数 213

什么是结束?我们在.NET有他们吗?

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

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2009-01-09 16:04:44

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

从本质上说,闭包是一个代码块,可以在以后执行,但它维护最初创建它的环境--也就是说,即使在该方法完成执行之后,它仍然可以使用创建它的方法的局部变量等。

闭包的一般特性是通过匿名方法和lambda表达式在C#中实现的。

下面是一个使用匿名方法的示例:

代码语言:javascript
运行
复制
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);
        };
    }
}

输出:

代码语言:javascript
运行
复制
counter=1
counter=2

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

票数 282
EN

Stack Overflow用户

发布于 2011-08-22 03:47:08

如果您对C#如何实现闭包感兴趣,请阅读“我知道答案( 42)博客”

编译器在后台生成一个类来封装阳极方法和变量j。

代码语言:javascript
运行
复制
[CompilerGenerated]
private sealed class <>c__DisplayClass2
{
    public <>c__DisplayClass2();
    public void <fillFunc>b__0()
    {
       Console.Write("{0} ", this.j);
    }
    public int j;
}

职能方面:

代码语言:javascript
运行
复制
static void fillFunc(int count) {
    for (int i = 0; i < count; i++)
    {
        int j = i;
        funcArr[i] = delegate()
                     {
                         Console.Write("{0} ", j);
                     };
    } 
}

将其转化为:

代码语言:javascript
运行
复制
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);
    }
}
票数 26
EN

Stack Overflow用户

发布于 2009-01-09 16:04:10

闭包是函数值,它从原来的作用域内保存变量值。C#可以以匿名委托的形式使用它们。

对于一个非常简单的例子,以下面的C#代码为例:

代码语言:javascript
运行
复制
    delegate int testDel();

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

    }

在它的末尾,bar将被设置为4,myClosure委托可以传递到程序的其他地方使用。

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/428617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档