Enum Flags测试的差异?

时间:2011-09-23 14:46:40

标签: .net enums

正在考虑另一个问题,并且好奇这两者之间是否存在任何差异(运作或表现)。

假设:

[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) ...

  3. 我知道他们做了什么有点明智,我知道HasFlag取代了他们。但Jon Skeet建议使用一个,MSDN文档推荐另一个。

2 个答案:

答案 0 :(得分:2)

如果bus不是2的幂(如果它设置了多个位),并且trip只设置了其中一些位,(trip & bus) == bus将为false,但是{{ 1}}将是真的。

答案 1 :(得分: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.

但是,如果您不对标志枚举的值使用2的幂,则很可能会出现更大的问题。如果Plane的值为3,请考虑会发生什么:您无法告诉Bus | TrainPlane ...