在javascript中,通常使用闭包创建然后立即调用匿名函数,如下所示:
var counter = (function() {
var n = 0;
return function() { return n++; }
}());
由于强类型,这在C#中非常详细:
Func<int> counter = ((Func<Func<int>>)(() =>
{
int n = 0;
return () => n++;
}))();
在C#中有更优雅的方式来处理这类事情吗?
答案 0 :(得分:15)
你不需要C#中的外部lambda,它可以用一个简单的块代替。
直接调用lambda是Javascript中缺少块级变量的解决方法(新版本使用let
支持块范围)。
Func<int> counter;
{
int n = 0;
counter = () => n++;
}
答案 1 :(得分:1)
答案 2 :(得分:1)
没有更好的方式,但演员阵容有点令人困惑,所以我更喜欢这个:
Func<int> counter = new Func<Func<int>>(() => { var n = 0; return () => n++; })();
编辑:正如CodeInChaos刚刚问到的那样,外部lambda似乎是多余的。
编辑2:不,这不是多余的,因为你需要关闭n。所以无论是上面的方式还是:
Func<Func<int>> counter = () => { var n = 0; return () => n++; };
int x = counter()();
编辑3:由于我不确定您是否要重用计数器功能,以便可以重新初始化,您想要两个场景(或其他场景)中的哪一个:
Func<Func<int>> counter0 = () => { var n = 0; return () => n++; };
Console.WriteLine("Counter0:");
var count0 = counter0();
for (var i = 0; i < 5; i++)
{
Console.WriteLine(count0());
}
var count1 = counter0();
for (var i = 0; i < 5; i++)
{
Console.WriteLine(count1());
}
Console.WriteLine("Counter1:");
Func<int> counter1 = new Func<Func<int>>(() => { var n = 0; return () => n++; })();
for (var i = 0; i < 5; i++)
{
Console.WriteLine(counter1());
}
for (var i = 0; i < 5; i++)
{
Console.WriteLine(counter1());
}
输出: 计数器0: 0 1 2 3 4 0 1 2 3 4 C1的: 0 1 2 3 4 五 6 7 8 9
答案 3 :(得分:-1)
演员真的有必要吗?这取决于你如何使用func。
可以简单地执行类似
的操作Func<int> counter = () => { int n; return n++;}
但是,这似乎有点奇怪,在func中声明变量,我很确定它不是你想要的。