在创建时调用Lambdas

时间:2011-11-24 16:43:59

标签: c# .net lambda closures

在javascript中,通常使用闭包创建然后立即调用匿名函数,如下所示:

var counter = (function() {
    var n = 0;
    return function() { return n++; }
}());

由于强类型,这在C#中非常详细:

Func<int> counter = ((Func<Func<int>>)(() =>
{
    int n = 0;
    return () => n++;
}))();

在C#中有更优雅的方式来处理这类事情吗?

4 个答案:

答案 0 :(得分:15)

你不需要C#中的外部lambda,它可以用一个简单的块代替。

直接调用lambda是Javascript中缺少块级变量的解决方法(新版本使用let支持块范围)。

Func<int> counter;

{
     int n = 0;
     counter = () => n++;
}

答案 1 :(得分:1)

我唯一可以建议的是Func<int> counter可能是var counter,但却无法想到其他任何事情。请注意,counter仍然是强类型的。


另请参阅:var

答案 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中声明变量,我很确定它不是你想要的。