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

C# 使用标志枚举的优缺点是什么?,c#,bit-fields,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,

我从硬件接收到几个位字段

我的代码最初是:

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

有关的详细信息。

请尝试从使用此代码的开发人员的角度来查看它。编写单元测试是一种很好的方法;编写示例(代码示例)是另一种方法。哪种方式允许开发人员编写最清晰的代码?哪种方式对客户端开发人员来说最直观?哦。。。非常感谢。我使用的是.NET4.0,但是这个功能以前没有出现在我的雷达上。不幸的是,(至少在MSDN页面上的用户评论中)它看起来相当慢。可耻@StephenKennedy:注意到了,但我只会担心它会导致问题,并且您的代码对性能非常关键。无需过早优化任何内容。如果其他人感兴趣,请在HasFlag上讨论: