булева операция върху методи

Възможен дубликат:
Компилаторът продължава ли да оценява израз, където всички трябва да са истина, ако първият е невярно?
Разлика между нетърпелива операция и операция на късо съединение? (| срещу || и & срещу &&)

Ето го въпросът ми. Ако имам това

if (Foo() && Bar())
    DoStuff();

ако Foo() върне false, ще продължи ли да работи през Bar()? или трябва да имам

if (Foo())
    if (Bar())
        DoStuff();

за да се гарантира, че преминава само през минималното необходимо количество, преди да се „откаже“?


person claudekennilol    schedule 26.06.2012    source източник
comment
Добър въпрос, бихте могли да зададете точка на прекъсване в Bar(), за да видите дали е достигната по време на тази проверка.   -  person ZnArK    schedule 26.06.2012
comment
Това е било задавано може би 100 пъти преди. Моля, направете надлежна проверка.   -  person Joe    schedule 26.06.2012


Отговори (3)


if (Foo() && Bar())

В този случай (логическо И) той първо ще провери Foo() върнатата стойност и ще направи Bar() само ако Foo() върне вярно. Просто ако някое от условията е невярно, то няма да проверява други, ще проверява условията отляво надясно.

person Zbigniew    schedule 26.06.2012

Не, Bar() няма да бъде оценено, ако Foo() върне false. Това е функция на оператора C# && (не се ограничава до if изрази):

Операторът условно И (&&) изпълнява логическо И на своите bool операнди, но оценява втория си операнд само ако е необходимо.

person Eren Ersönmez    schedule 26.06.2012

Това, което търсите, се нарича „Късо съединение“ и да, .Net го поддържа.

person Bobby D    schedule 26.06.2012
comment
а във VB.NET ключовата дума е AndAlso за && и OrElse за ||. - person John Alexiou; 26.06.2012
comment
Не бях чувал за късо съединение преди, благодаря, че го посочи. - person claudekennilol; 26.06.2012