对C#函数输出感到困惑

时间:2015-09-22 22:33:11

标签: c#

当我在脑海里练习这个例子时,我得到了4 8 3的输出。当我运行该函数但是得到输出4 8 6时,我理解如何获得48,但我无法理解y = 6的方式。不应该y = 3吗?运行a1会导致y +=1因此y = 1然后a2会运行,从而产生y+=2 y = 3

void Main() {
    int y = 0;
    Func<int,bool> even = (n) => { return n%2 == 0; };
    Func<int,int> dub = (n) => { y += 2; return n + n; };
    Func<int,int> succ = (n) => { y += 1; return n + 1; };

    Func<bool, int, int, int> if1 = (c, t, f) => c? t: f;
    y = 0;
    var a1 = if1(even(3), dub(3), succ(3));
    var a2 = if1(even(4), dub(4), succ(4));

    Console.WriteLine("{0} {1} {2}", a1, a2, y);
}

2 个答案:

答案 0 :(得分:4)

尽管turn=10-sum(state==0); 中的条件表达式仅使用if1t,但发送到f的值始终会在调用之前计算。

要仅在需要时计算值,您可以将代理发送给函数,而不是值:

if1

答案 1 :(得分:2)

您必须在此处意识到,对if1的两次调用都会传递dubsucc返回值(因为您实际上称之为var a1 = if1(even(3), dub(3), succ(3)); var a2 = if1(even(4), dub(4), succ(4)); )。

if1

这意味着无论是否使用返回值(由y确定),方法都已运行,并已修改dub。这就是为什么它是6,因为succlibrary(gsubfn) m <- strapply(a, '(.*)/(.*)', ~ c(FPath=x, FileName=y), simplify=rbind) Final <- as.data.frame(m, stringsAsFactors = FALSE) 被程序调用了两次,而2 + 2 + 1 + 1 = 6