如果我有一個If
聲明有兩個條件 - 第一個失敗,第二個條件是否會被考慮或將直接進入else
?那麼,在下面的例子中,如果myList.Count == 0
,將myString
與「價值」進行比較,還是隻是直接到else
?如果IF語句不符合第一個條件,IF語句是否會停止評估?
if(myList.Count > 0 && myString.Equals("value"))
{
//Do something
}
else
{
//Do something else
}
如果我有一個If
聲明有兩個條件 - 第一個失敗,第二個條件是否會被考慮或將直接進入else
?那麼,在下面的例子中,如果myList.Count == 0
,將myString
與「價值」進行比較,還是隻是直接到else
?如果IF語句不符合第一個條件,IF語句是否會停止評估?
if(myList.Count > 0 && myString.Equals("value"))
{
//Do something
}
else
{
//Do something else
}
它將停止評估,因爲您使用的是雙符號運算符& &。這叫做short-circuiting。
如果你把它改成一個符號:
if(myList.Count > 0 & myString.Equals("value"))
它會同時評估。
非常感謝Paul,+1。你什麼時候真的想要使用&運算符(例如,如果第一個條件是錯誤的,你甚至想查看第二個)? – 2012-07-06 08:33:11
在這種情況下你當然不會。如果你的第二個條件是一個函數調用,你可以使用它來執行一些你想要發生的更新(不過我不知道你爲什麼要這麼做)。 – 2012-07-06 08:38:10
@DeeMac考慮代碼:'public bool DoAllWork(){return DoWork()&DoExtraWork(); }'因爲我們使用單個'&',即使第一個方法調用('DoWork()')返回'false',額外的工作也會完成。如果我們使用'&&',那麼額外的工作只會在第一次調用返回true的時候完成。但是,大多數程序員從不使用帶有布爾運算符的'&'運算符。對於整數類型(保存比1位更多的信息),這是另一回事。 – 2012-07-06 09:28:27
不,它不會被考慮。 (這被稱爲short circuiting)
編譯器是足夠聰明(和語言規範要求),要知道,如果第一個條件是false
,沒有辦法表達式會true
。
而且當Jacob指出||
時,當第一個條件是true
時,第二個條件將不被評估。
反之亦然|| - 如果第一個選項爲「true」,則不會評估第二個選項。 – 2012-07-06 08:31:00
我更新了答案以反映@JacobRaihle評論。 – MBen 2012-07-06 08:32:58
沒有,如果你使用&&
,
如果使用&
將被視爲
啊對,沒有意識到,即使是一個誠實的運營商。 – 2012-07-06 08:31:38
在您的例子第二個條件將被跳過,第二條語句將僅在第一個失敗評估。當兩個操作數都爲真時,邏輯AND &&
將僅返回true
,即短路評估。
如果邏輯運算符是AND(& &),那麼IF語句將評估第一個表達式 - 如果第一個表達式爲false,則不會評估第二個表達式。這對於在引用方法上檢查變量是否爲空有用,以避免空指針異常
如果邏輯運算符是OR(||),那麼IF語句將評估第一個表達式 - 如果第一個表達式爲真,它不會評估第二個。
編譯器和運行時都對這種行爲優化
.NET支持short circuiting
所以當第一個條件去失敗,也不會檢查第二condtion ....在C#||和& &是邏輯運營商的短路版本|和&分別....它往往是更快的太...
考慮如下因素:
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。
如果將測試更改爲& &只檢查第一個。
該表達式將從左到右進行評估,因爲它是一個邏輯AND運算。如果錯誤,它將停止評估。它也是你表達中操作的最高優先級。
有條件-AND運算符(& &)進行邏輯與它的布爾操作數,但如果必要的話只有評價其第二操作數。 Conditional And Operator (&&) MSDN
這裏是一組sections listing the C# operators starting with the highest precedence to the lowest。
C#中的*布爾邏輯運算符*是「short circuiting」。那裏有很多關鍵字。 – 2012-07-06 08:30:55
請注意,這不是執行此操作的'if'語句,它是AND和OR boolan操作符的屬性。 – unwind 2012-07-06 08:33:06