2015-09-22 3 views
0

Когда я работал над этим примером в своей голове, я получил вывод 4 8 3. Когда я запускаю функцию, но получаю вывод 4 8 6, я понимаю, как получить 4 и 8, но я не могу понять, как y = 6. Не должно y = 3? a1, результаты которого приведены в y +=1, поэтому y = 1 затем a2 работает, что приводит к y+=2 так y = 3.Смущенный о выходе функции C#

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); 
} 
+0

Вы дважды вызывали 'dub' и' succ', поэтому результат 6 –

+1

Dub +2 и Succ +1 и оба запускаются дважды? 2 + 1 + 2 + 1 = 6 –

+0

@JonathanWood n% 1 == 0 для всех целых чисел. Он ничего не говорит о том, является ли число четным. Указанная функция правильна для определения того, является ли значение четным. – zstewart

ответ

2

То, что вы должны понимать здесь в том, что два вызова 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

4

Eventhough у вас есть условное выражение в 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)); 
+0

Спасибо! в этом есть смысл. – M0rty

Смежные вопросы