注意以下簡單的例子:位運算 - 檢查和清除
Module Module1
<Flags>
Public Enum Names
None = 0
Test = 1
Test2 = 2
Test3 = 4
Test4 = 8
End Enum
Sub Main()
Dim test As Names = Names.Test Or Names.Test3
If (test And Names.Test3) = Names.Test3
Console.WriteLine("TRUE")
Else
Console.WriteLine("FALSE")
End If
End Sub
End Module
我的問題的第一部分涉及行If (test And Names.Test3) = Names.Test3
。
簡單地檢查If test And Names.Test3
好像標誌存在不是更好嗎?如果它評估爲一個非零值(意味着該標誌存在),則該條件的結果總是爲True
。
是否有充分的理由使用第二種檢查方式? (雖然我的答案是針對VB.NET,但我也有興趣知道這是否是其他地方的潛在缺陷,即C#,C++等)。
此外,關於標誌去除,似乎有兩種方法可以做到這一點:
test = test Xor Names.Test3
和test = test And Not Names.Test3
然而,首先會增加,如果缺少它的標誌,並刪除它,如果它是那裏,而第二個只會刪除它。這是唯一的區別嗎?或者還有另一個原因,爲什麼我應該更喜歡一種方法而不是另一種?
我們平時只有像1個問題。但對於你的第二,這是你的情況的差異。當你開始合併標誌(測試Xor(Names.Test2或Names.Test3))時,它會變得更加複雜。在這種情況下,如果你沒有打開兩個標誌,Xor可能會產生奇怪的結果。 –
我想我的問題已經足夠小了他們不應該被拆分,你所標記的Xor'似乎能夠按照我的預期工作,它只是一次完成所有的事情,在你的例子中,它增加了'Names.Test2',因爲它不存在,並刪除'Names.Test3',因爲它(已經存在)! – Interminable