考慮下面的代碼問題與運營商&&
public bool GetFalse()
{
return false;
}
public bool GetTrue()
{
return true;
}
我怎麼能強迫此表達GetFalse() && GetTrue()
執行第二種方法?
考慮下面的代碼問題與運營商&&
public bool GetFalse()
{
return false;
}
public bool GetTrue()
{
return true;
}
我怎麼能強迫此表達GetFalse() && GetTrue()
執行第二種方法?
您不能因爲邏輯AND運算符短路。在一般情況下,避免類似表達式的副作用是一個好主意,雖然有完全有效的用法(即,if(someObj != null && someObj.Value == whatever)
。您可以使用不會短路的按位和運算符(&
),但是我也會「T做
你應該拆分這兩個方法調用到變量,然後再如果你需要他們既要執行執行檢查
bool first = SomeMethodCall();
bool second = SomeMethodThatMustExecute();
if(first && second)
{
// ...
}
但不會短路。 – blowdart 2011-06-14 15:49:43
@blowdart:是的,我正在編輯。這總是圍繞這裏的比賽:)。可能不應該這樣做。 – 2011-06-14 15:50:59
如果你拆分了這些調用(而不是使用'&'),那麼讀取該代碼的其他人(或者你在幾個月內)將會看到兩個方法總是被調用。你不必記住'&'和'&&'之間的區別。 – 2011-10-18 10:08:39
與嘗試:。
GetFalse() & GetTrue()
我不會建議這樣做(儘管它回答了問題)。請分別打電話給他們。 – 2011-06-14 15:56:13
使用非短路ting版本(在不使用布爾值時也稱爲按位AND):
GetFalse() & GetTrue();
這是一個優化問題。由於表達式中調用的第一個方法爲false,因此整個表達式不能爲真,因此表達式中的第二個方法不會被調用。如果有必要把這種對副作用(不好的做法,依靠一個副作用,但情況因人而異),這樣的事情應該用:
x = GetFalse();
y = GetTrue();
if (x && y) ...
假設您的實際功能執行一些特定任務和返回說明(例如)值,成功或失敗,我寧願看到這個寫成
bool fooResult = DoFoo();
bool barResult = DoFar();
然後你就可以在你的代碼中使用fooResult && barResult
。
您正在使用短路的'和'運算符,因此只要無法評估爲「true」,表達式就會失敗。你想達到什麼目的? – linuxuser27 2011-06-14 15:49:42
我建議不要依靠兩者來執行。這聽起來像實際的GetFalse()或GetTrue()有一些副作用,如果兩者都需要執行。 – jglouie 2011-06-14 15:51:45
@jglouie:同意。如果他們都需要執行,那麼你應該分別調用它們,並在稍後檢查結果。 – 2011-06-14 15:55:39