【问题标题】:What are the pros and cons of using a flags enum?使用标志枚举的优缺点是什么?
【发布时间】:2011-10-26 17:40:28
【问题描述】:

我从硬件接收到几个位域。

我的代码原来是:

public readonly byte LowByte;

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

然后我想起了 flags 枚举,正在考虑将其更改为:

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

等等。

最佳做法是什么?每种方法的优缺点是什么?

编辑:我很想知道这两种方法之间是否存在任何实际差异,尤其是在性能方面。我不希望就编码风格征求意见(除非它来自微软指南),因为那样会认为这个问题没有建设性。谢谢。

【问题讨论】:

  • 尝试从使用此代码的开发人员的角度来看待它。编写单元测试是做到这一点的一种好方法。编写示例(代码示例)是另一回事。哪种方式可以让开发人员编写最清晰的代码?对于客户端开发人员来说,哪种方式最直观?

标签: c# bit-fields


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您使用的是 .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,但该功能之前没有引起我的注意。
    • 不幸的是(至少从 MSDN 页面上的用户评论来看)它相当慢。可耻!
    • @StephenKennedy:注意到了,但如果它开始引起问题并且您的代码对性能非常关键,我只会担心它。无需过早地优化任何东西。
    • 如果其他人有兴趣,讨论HasFlag:stackoverflow.com/questions/7368652/…
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2010-09-08
      • 1970-01-01
      • 2017-08-06
      相关资源
      最近更新 更多