[英]Confused about C# function output
當我腦海中遍歷這個示例時,我得到的輸出為4 8 3
。 但是,當我運行該函數時,得到的輸出是4 8 6
,我知道如何獲取4
和8
但是我不明白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);
}
即使在if1
中有一個只使用t
或f
的條件表達式,發送給if1
的值始終在調用之前計算。
要僅在需要時計算值,可以將委托而不是值發送給函數:
Func<bool, Func<int>, Func<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));
您必須在這里意識到的是,對if1
的兩次調用都傳遞了dub
和succ
的返回值 (因為您實際上是在調用它們)。
var a1 = if1(even(3), dub(3), succ(3));
var a2 = if1(even(4), dub(4), succ(4));
這意味着無論是否使用返回值(由if1
確定),方法都已運行並已修改y
。 這就是為什么它是6,因為dub
和succ
都被程序調用了兩次,並且2 + 2 + 1 + 1 = 6
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.