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

7
我从硬件接收到多个位域。
我的代码最初是:
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; } }

“等等”、“诸如此类”的意思。
“哪种是最佳实践?每种方法有什么优缺点?”编辑:我想知道这两种方法之间是否有任何实际差异,特别是在性能方面。我不希望征求关于编码风格的意见(除非它来自Microsoft指南),因为那会使问题被关闭为无建设性的。谢谢。

试着从开发人员使用这段代码的角度来看待它。编写单元测试是一种很好的方法;编写示例(代码样本)是另一种方法。哪种方式可以让开发人员编写最清晰的代码?哪种方式对客户端开发人员最直观? - TrueWill
3个回答

5
后者是最佳实践,因为它使你的代码更易读。

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

哦,谢谢。我正在使用.NET 4.0,但这个函数之前并没有引起我的注意。 - Stephen Kennedy
不幸的是,从MSDN页面上的用户评论来看,它似乎相当慢。真遗憾! - Stephen Kennedy
@StephenKennedy:注意到了,但只有在它开始引起问题并且您的代码极度依赖性能时才需要担心。没有必要过早地优化任何东西。 - Bryan Crosby
如果其他人感兴趣,可以讨论HasFlag:https://dev59.com/questions/k2s05IYBdhLWcg3wPPaB - Stephen Kennedy

1

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

否则,基于你的第一个例子,你需要添加注释,因为你基本上在操作神奇(位)数字,这使得代码更难以阅读,特别是对于不熟悉它的其他人。即使你自己将在六个月后维护此代码,你可能会发现很难记住位5的用途。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接