2011-09-23 145 views
3

正在研究另一個問題,並且對這兩者之間是否存在任何差異(在操作或性能上)感到好奇。測試枚舉標誌的區別?

考慮:

[Flags] 
enum TransportModes 
{ 
    None = 0, 
    Bus = 1, 
    Train = 2, 
    Plane = 4 
} 

和可變

var trip = TransportModes.Bus | TransportModes.Train; 
  1. if((trip & TransportModes.Bus) == TransportModes.Bus) ...

  2. if((trip & TransportModes.Bus)) != 0) ...

我知道他們做什麼比特幣,我知道HasFlag取代他們。但是Jon Skeet推薦了一個,MSDN文檔推薦了另一個。

回答

2

如果給你的枚舉值的值不是2的冪,你的第二個選項將返回true。第一個選項沒有這個問題。

例子:

[Flags] 
enum TransportModes 
{ 
    None = 0, 
    Bus = 1, 
    Train = 2, 
    Plane = 5 
} 

var trip = TransportModes.Bus | TransportModes.Train; 

if((trip & TransportModes.Plane) != 0) 
    // will be executed 
if((trip & TransportModes.Plane) == TransportModes.Plane) 
    // won't be executed 

說明:
trip & TransportModes.Plane是1這顯然是!= 0,但不等於TransportModes.Plane其中有5

值但是,如果你不使用權力兩個標誌枚舉的值,你很可能有更大的問題。想想看會發生什麼,如果Plane的值爲3:除了Bus | TrainPlane之外,還有其他值...

2

如果bus是不是2的功率(如果有設置多個位),以及trip只有一些設置,(trip & bus) == bus會是假的那些位,但(trip & bus)) != 0將是真實的。