2012-07-06 48 views
43

如果我有一個If聲明有兩個條件 - 第一個失敗,第二個條件是否會被考慮或將直接進入else?那麼,在下面的例子中,如果myList.Count == 0,將myString與「價值」進行比較,還是隻是直接到else如果IF語句不符合第一個條件,IF語句是否會停止評估?

if(myList.Count > 0 && myString.Equals("value")) 
{ 
//Do something 
} 
else 
{ 
//Do something else 
} 
+7

C#中的*布爾邏輯運算符*是「short circuiting」。那裏有很多關鍵字。 – 2012-07-06 08:30:55

+1

請注意,這不是執行此操作的'if'語句,它是AND和OR boolan操作符的屬性。 – unwind 2012-07-06 08:33:06

回答

67

它將停止評估,因爲您使用的是雙符號運算符& &。這叫做short-circuiting

如果你把它改成一個符號:

if(myList.Count > 0 & myString.Equals("value")) 

它會同時評估。

+0

非常感謝Paul,+1。你什麼時候真的想要使用&運算符(例如,如果第一個條件是錯誤的,你甚至想查看第二個)? – 2012-07-06 08:33:11

+4

在這種情況下你當然不會。如果你的第二個條件是一個函數調用,你可以使用它來執行一些你想要發生的更新(不過我不知道你爲什麼要這麼做)。 – 2012-07-06 08:38:10

+1

@DeeMac考慮代碼:'public bool DoAllWork(){return DoWork()&DoExtraWork(); }'因爲我們使用單個'&',即使第一個方法調用('DoWork()')返回'false',額外的工作也會完成。如果我們使用'&&',那麼額外的工作只會在第一次調用返回true的時候完成。但是,大多數程序員從不使用帶有布爾運算符的'&'運算符。對於整數類型(保存比1位更多的信息),這是另一回事。 – 2012-07-06 09:28:27

16

不,它不會被考慮。 (這被稱爲short circuiting

編譯器是足夠聰明(和語言規範要求),要知道,如果第一個條件是false,沒有辦法表達式會true

而且當Jacob指出||時,當第一個條件是true時,第二個條件將不被評估。

+2

反之亦然|| - 如果第一個選項爲「true」,則不會評估第二個選項。 – 2012-07-06 08:31:00

+0

我更新了答案以反映@JacobRaihle評論。 – MBen 2012-07-06 08:32:58

3

沒有,如果你使用&&

如果使用&將被視爲

+0

啊對,沒有意識到,即使是一個誠實的運營商。 – 2012-07-06 08:31:38

1

在您的例子第二個條件將被跳過,第二條語句將僅在第一個失敗評估。當兩個操作數都爲真時,邏輯AND &&將僅返回true,即短路評估

7

如果邏輯運算符是AND(& &),那麼IF語句將評估第一個表達式 - 如果第一個表達式爲false,則不會評估第二個表達式。這對於在引用方法上檢查變量是否爲空有用,以避免空指針異常

如果邏輯運算符是OR(||),那麼IF語句將評估第一個表達式 - 如果第一個表達式爲真,它不會評估第二個。

編譯器和運行時都對這種行爲優化

1

.NET支持short circuiting所以當第一個條件去失敗,也不會檢查第二condtion ....在C#||和& &是邏輯運營商的短路版本|和&分別....它往往是更快的太...

2

考慮如下因素:

static int? x; 
static int? y; 

static void Main(string[] args) 
{ 
    x = 5; 
    if (testx() & testy()) 
    { 
     Console.WriteLine("test"); 
    } 
} 

static Boolean testx() 
{ 
    return x == 3; 
} 

static Boolean testy() 
{ 
    return y == 10; 
} 

如果跟蹤過兩個testx和暴躁的功能,即使testx是假的evaulated。

如果將測試更改爲& &只檢查第一個。