[英]What is the equivalent javascript closure in c#?
考慮一下這個簡單的.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?
}
您可以使用ValueTuples和lambda表達式的混合。
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();
使用Dictionary
來映射以下代碼,使用Action Delegate
映射enumerated data types
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.Increment
或Interlocked.Decrement
來處理線程安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.