.net 枚举标志测试中的差异?

.net 枚举标志测试中的差异?,.net,enums,.net,Enums,我在看另一个问题,很好奇这两个问题(在操作或性能上)是否有任何区别 鉴于: [Flags] enum TransportModes { None = 0, Bus = 1, Train = 2, Plane = 4 } 和一个变量 var trip = TransportModes.Bus | TransportModes.Train; if((trip&TransportModes.Bus)=TransportModes.Bus). if((trip&Transpo

我在看另一个问题,很好奇这两个问题(在操作或性能上)是否有任何区别

鉴于:

[Flags]
enum TransportModes
{
   None = 0,
   Bus = 1,
   Train = 2,
   Plane = 4
}
和一个变量

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

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


  • 我知道他们做了些什么,我知道这会取代他们。但是Jon Skeet推荐了一个,MSDN文档推荐了另一个。

    如果
    总线
    不是二的幂(如果它有多个位集),并且
    trip
    只有一些位集,
    (trip&bus)==bus
    将为false,但是
    (trip&bus))!=0将为true。

    如果您为枚举值指定的值不是二的幂,则第二个选项将返回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
    
    说明:
    行程和运输模式。飞机
    为1,显然是
    !=0,但不等于值为5的TransportModes.Plane

    但是,如果不对标志枚举的值使用二的幂,则很可能会出现更大的问题。想想会发生什么,如果
    Plane
    的值为3:你无法区分
    Bus | Train
    Plane