什么是closure?我们有吗.网

如果他们真的存在的话.NET,你能提供一个代码片段(最好是C#)来解释它吗?

推荐答案

我有an article on this very topic个.(它有很多例子.)

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

闭包的一般特性在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本身已经完成.

.net相关问答推荐

防止在 .NET 上构建路径中的反斜杠以进行跨平台部署

在 Git for Visual Studio 2012 中恢复到以前的提交

标签从右向左增长

如何从标头中检索基本身份验证凭据?

如何判断 IOException 是否为 Not-Enough-Disk-Space-Exception 类型?

在一个 LINQ 查询中获取两列的总和

为什么循环引用被认为是有害的?

在 .NET C# 中存储加密密钥的最佳方式

XmlNode 值与内部文本

Winforms:Application.Exit vs Environment.Exit vs Form.Close

如何从字符串中删除所有字母字符?

从 C# 中的接口继承 XML 注释

互锁且易变

.NET 的 String.Normalize 有什么作用?

.NET 的黄瓜替代品

C# 中的 override 和 new 关键字有什么区别?

如何使用 Entity Framework Code First CTP 5 存储图像?

ConcurrentDictionary TryRemove 何时返回 false

对构造函数进行单元测试重要吗?

如何获取当前的 ProcessID?