2013-07-12 62 views
4

我想寫點東西像下面....C#布爾操作來檢測任何虛假申報

bool hasAnyInvalid = false; 
hasAnyInvalid |= IsValidType1(...); 
hasAnyInvalid |= IsValidType2(...); 
hasAnyInvalid |= IsValidType3(...); 
hasAnyInvalid |= IsValidType4(...); 

if (hasAnyInvalid){ return false; } 

至於我可以告訴大家,上面會失敗,因爲真|真是假。

如何使用一個布爾變量來測試多個函數的錯誤?

我需要評估每個IsValidType函數。所以我不能把它短路。

基本上,我想要一個邏輯門,一旦它變爲真,它就會保持真實。我似乎回想過在C++中用HRESULT返回來做這件事,但我們可能只是將嚴重性的整數值加起來。

我接受其他解決方法。

編輯: 我很好地措辭這個問題,幷包括一些邏輯斯奈弗斯(我打算寫這是一個XOR)。 上面我會留下我原來的問題,因爲人們對它有特別的評論,而且我討厭改變歷史。

+6

是不是'''按位或'運算符?所以'真的|真'是'真'。並且'true |假'也將是'真',所以一旦它變爲真,它就會保持真實。我沒有看到問題OP。在做出假設之前,你是否真的測試過它? –

回答

6

如果要檢測單個false,你需要使用一個&,不是|

bool allValid = true; // Start it with "true" 
allValid &= IsValidType1(...); // The first "false" will make "allValid" false 
allValid &= IsValidType2(...); 
allValid &= IsValidType3(...); 
allValid &= IsValidType4(...); 
if (!allValid) { // Invert "allValid" before returning 
    return false; 
} 
+1

+1給變量和它的初始值一個好名字 – rajeemcariazo

+0

我不認爲他想知道ALL是否有效。他想知道是否有效。 –

+0

@JimRhodes他想知道是否有*無效*(這是'!allValid'的另一種說法):-) – dasblinkenlight

4

這將短路的功能他們的價值觀的評價,並且將返回true如果的任何的函數返回false。

bool[] results = new[] { 
    IsValidType1(), 
    IsValidType2(), 
    IsValidType3(), 
    IsValidType4() 
}; 
return results.Any(b => !b); 

注意,它讀取喜歡你的要求:返回true如果結果的任何false

我需要評估每個IsValidType函數。所以我不能把它短路。

這必須表示該功能有副作用,您需要遵守。只要確保你記錄了你的代碼,以便沒有人看到這一點,並沒有意識到將其改爲短路功能評估可能會通過消除副作用來引入錯誤。

據我所知,以上將失敗,因爲true | truefalse

我不確定是什麼讓你覺得。 true | true,即true or truetrue。你可能想到xor,但那將是true^true

+0

我在XOR土地。對不起,還沒有咖啡。 – ElMalakai

+0

另外,+ 1,因爲我沒有想到這樣做與數組。這在我當前的代碼中是沒有意義的,但是這爲處理大量驗證函數提供了一種更好的方式。 – ElMalakai

+0

'任何'_will_短路。問題說這不好,但我想知道它是不是真的。無論如何,你的答案都是錯誤標記的。 –

-1

沒有必要,你可以像下面的變量:

private bool IsValidForAllTypes(...) 
{ 
    return IsValidType1(...) & IsValidType2(...) & IsValidType3(...) & IsValidType4(...); 
} 
+0

他說*沒有*短路! – jason

+0

修復了不做短路的答案 – GuyVdN

+0

我沒有做出短路的downvote。儘管如此,在返回之前仍然需要反轉答案。 – dasblinkenlight

1

與您的代碼的問題是,你的可變標誌無效而功能檢查的有效性。 您可以更改每個IsValid呼叫的返回值,以使其回答問題IsInvalid。 只需在每個IsValid調用之前添加一個!即可。 代碼如下所示:

bool hasAnyInvalid = false; 
hasAnyInvalid |= !IsValidType1(...); 
hasAnyInvalid |= !IsValidType2(...); 
hasAnyInvalid |= !IsValidType3(...); 
hasAnyInvalid |= !IsValidType4(...); 

return hasAnyInvalid;