使用标志枚举的优点和缺点是什么?

时间:2011-10-26 17:40:28

标签: c# bit-fields

我从硬件接收了几个位字段。

我的代码最初是:

public readonly byte LowByte;

public bool Timer { get { return (LowByte & 1) == 1; } }

然后我想起了旗帜枚举,并考虑将其改为:

[Flags]
public enum LowByteReasonValues : byte
{
    Timer = 1,
    DistanceTravelledExceeded = 2,
    Polled = 4,
    GeofenceEvent = 8,
    PanicSwitchActivated = 16,
    ExternalInputEvent = 32,
    JourneyStart = 64,
    JourneyStop = 128
}

public readonly LowByteReasonValues LowByte;

public bool Timer { get { return (LowByte & LowByteReasonValues.Timer) == LowByteReasonValues.Timer; } }

等等。

哪种方法是最佳实践?如果有的话,每种方法的优缺点是什么?

编辑:我很想知道这两种方法之间是否存在任何实际差异,特别是在性能方面。我不希望征求关于编码风格的意见(除非它来自微软的指导方针),因为这会将问题视为非建设性的。感谢。

3 个答案:

答案 0 :(得分:5)

后者是最佳实践,因为它使您的代码更具可读性

答案 1 :(得分:4)

如果您使用的是.NET 4.0,现在可以使用HasFlag方法检查枚举是否包含特定位。这使得它比以前的检查方法更具可读性。

[Flags]
public enum LowByteReasonValues : byte
{
    Timer = 1,
    DistanceTravelledExceeded = 2,
    Polled = 4,
    GeofenceEvent = 8,
    PanicSwitchActivated = 16,
    ExternalInputEvent = 32,
    JourneyStart = 64,
    JourneyStop = 128
}

public readonly LowByteReasonValues LowByte;

public bool Timer 
{
  get 
  { 
    return (LowByte.HasFlag(LowByte.Timer));
  } 
}

有关MSDN的更多信息。

答案 2 :(得分:1)

至少,您的第二个示例具有更好的语义,并指示代码中位的含义。代码中有一些文档用于该位。

否则,根据您的第一个示例,您将需要添加注释,因为您基本上是在捣乱魔术(位)数字,这使得代码更难以阅读,尤其是其他不熟悉它的人。即使您自己将在未来六个月内维护此代码,您可能会发现很难记住第5位的用途。