2011-06-14 102 views
3

考慮下面的代碼問題與運營商&&

public bool GetFalse() 
    { 
     return false; 
    } 
    public bool GetTrue() 
    { 
     return true; 
    } 

我怎麼能強迫此表達GetFalse() && GetTrue()執行第二種方法?

+1

您正在使用短路的'和'運算符,因此只要無法評估爲「true」,表達式就會失敗。你想達到什麼目的? – linuxuser27 2011-06-14 15:49:42

+2

我建議不要依靠兩者來執行。這聽起來像實際的GetFalse()或GetTrue()有一些副作用,如果兩者都需要執行。 – jglouie 2011-06-14 15:51:45

+0

@jglouie:同意。如果他們都需要執行,那麼你應該分別調用它們,並在稍後檢查結果。 – 2011-06-14 15:55:39

回答

5

您不能因爲邏輯AND運算符短路。在一般情況下,避免類似表達式的副作用是一個好主意,雖然有完全有效的用法(即,if(someObj != null && someObj.Value == whatever)。您可以使用不會短路的按位和運算符(&),但是我也會「T做

你應該拆分這兩個方法調用到變量,然後再如果你需要他們既要執行執行檢查

bool first = SomeMethodCall(); 
bool second = SomeMethodThatMustExecute(); 

if(first && second) 
{ 
    // ... 
} 
+1

但不會短路。 – blowdart 2011-06-14 15:49:43

+0

@blowdart:是的,我正在編輯。這總是圍繞這裏的比賽:)。可能不應該這樣做。 – 2011-06-14 15:50:59

+0

如果你拆分了這些調用(而不是使用'&'),那麼讀取該代碼的其他人(或者你在幾個月內)將會看到兩個方法總是被調用。你不必記住'&'和'&&'之間的區別。 – 2011-10-18 10:08:39

6

與嘗試:。

GetFalse() & GetTrue() 
+1

我不會建議這樣做(儘管它回答了問題)。請分別打電話給他們。 – 2011-06-14 15:56:13

4

使用非短路ting版本(在不使用布爾值時也稱爲按位AND):

GetFalse() & GetTrue(); 
0

這是一個優化問題。由於表達式中調用的第一個方法爲false,因此整個表達式不能爲真,因此表達式中的第二個方法不會被調用。如果有必要把這種對副作用(不好的做法,依靠一個副作用,但情況因人而異),這樣的事情應該用:

x = GetFalse(); 
y = GetTrue(); 
if (x && y) ... 
0

假設您的實際功能執行一些特定任務和返回說明(例如)值,成功或失敗,我寧願看到這個寫成

bool fooResult = DoFoo(); 
bool barResult = DoFar(); 

然後你就可以在你的代碼中使用fooResult && barResult