2015-10-14 57 views
1
enum Test 
{ 
    X = 1, 
    Y = 1 << 1, 
    Z = 1 << 2, 
    All = ~0 
} 

將生成Test.All作爲按位元素的一個標誌,無論在稍後的時間點將添加多少個值到Test?例如,如果添加了新的價值觀:是否將枚舉值聲明爲〜0會生成一個(按位)的標誌?

enum Test 
{ 
    X = 1, 
    Y = 1 << 1, 
    Z = 1 << 2, 
    W = 1 << 3, 
    WAndZ = W | Z, 
    All = ~0 
} 

能夠保證所有的Test.All總是包含所有其他值?

+1

「全部」基本上相當於一個整數,所有位設置。 –

+1

我錯過了什麼嗎?爲什麼不使用'-1'? – Rob

+0

除此之外:雖然把None作爲沒有設置標誌的標籤是有用的,但你幾乎肯定不希望包含每個可能值的All標誌,即使是未分配的標誌。這是因爲「All」的含義有效隨着設計的每一個新標誌都會發生變化,對於從未編寫來處理它的軟件。 –

回答

1

是,按位,此枚舉值將包括所有其他值。這意味着測試是這樣的:

(Test.All & Test.X) == Test.X 

將評估爲true,此枚舉(即使X整數值是0)的所有成員。

同樣,你可以(也應該)有一個默認值0,當與其他標誌相匹配,這將評估爲false:

enum Test 
{ 
    None = 0,  // no flags 
    X = 1, 
    Y = 2, 
    Z = 4, 
    ... 
    All = ~0  // all flags 
} 

這意味着All將包括所有的標誌,和None將包括無標誌:

Debug.Assert((Test.All & Test.None) == Test.None); 
Debug.Assert((Test.All & Test.X) == Test.X); 
Debug.Assert((Test.All & Test.All) == Test.All); 

Debug.Assert((Test.None & Test.None) == Test.None); 
Debug.Assert((Test.None & Test.X) == Test.None); 
Debug.Assert((Test.None & Test.All) == Test.None);