在 C# 中,什么是等同于 JavaScript 闭包的东西?

8

考虑这个简单的 .js 代码:

const createCounter = () => {
    let value = 0;
    return {
        increment: () => { value += 1 },
        decrement: () => { value -= 1 },
        logValue: () => { console.log(value); }
    }
}

// 使用方法

const { increment, decrement, logValue } = createCounter();

我相信C#支持一等函数,注意我不想使用类来重新制作上面的代码。在C#中,等效的闭包是什么?

我已经做了这个:

public Func<WhatType?> CreateCounter = () => {
    var value = 0;
    return what?
}

你可以使用一个函数的Map。我不知道C#(或类似语言)中是否有解构的概念。 - MinusFour
您能提供任何关于函数映射表以及维持值状态的示例或参考资料吗? - Kevin Tanudjaja
2个回答

13

你可以使用ValueTupleslambda表达式的混合。

private static (Action increment, Action decrement, Action logValue) CreateCounter()
{
    var value = 0;

    return
        (
            () => value += 1,
            () => value -= 1,
            () => Console.WriteLine(value)
        );
}

使用方法

var (increment, decrement, logValue) = CreateCounter();
increment();
increment();
decrement();
logValue();

0

请查看以下使用Dictionary枚举数据类型Action Delegate映射的代码

void Main()
{
    OperationActionDictionary[Operation.Increment](); // Execute Increment
    OperationActionDictionary[Operation.Increment](); // Execute Increment
    OperationActionDictionary[Operation.Decrement](); // Execute Decrement
    OperationActionDictionary[Operation.LogValue]();  // Execute LogValue
}

public enum Operation
{
    Increment,
    Decrement,
    LogValue
}

public static int Value = 0;

public Dictionary<Operation,Action> OperationActionDictionary = new Dictionary<Operation, Action>
{
    [Operation.Increment] = () => Value += 1,
    [Operation.Decrement] = () => Value -= 1,
    [Operation.LogValue] = () => Console.WriteLine($"Value :: {Value}")
};

这里唯一需要注意的是,如果要修改共享的Value对象或任何其他代码,那么在多线程访问的情况下,您需要使用Interlocked.IncrementInterlocked.Decrement来确保线程安全。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接