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

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

我的代码最初是:

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; } } 

等等。

哪种方法最佳,哪种方法各有利弊?

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

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

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

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

如果您使用的是.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的更多信息。