2011-10-26 88 views
7

我正在接收来自硬件的几个位字段。使用flags枚举有什么优点和缺点?

我的代码最初是:

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指导方针),因为这会将问题视为无法构建的问题。谢谢。

+0

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

回答

1

最起码,你的第二个例子中具有更好的语义和表示代码中的位的含义。代码中有一些用于该位的文档。否则,根据您的第一个示例,您将需要添加注释,因为您基本上在编写魔术(比特)数字,这使得代码难以阅读,尤其是不熟悉它的其他人。即使你自己会在六个月后继续维护这个代码,你可能会发现很难记住第5位的用法。

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的更多信息。

+0

哦......谢谢。我正在使用.NET 4.0,但该功能以前没有出现在我的视线中。 –

+0

不幸的是,它会出现(至少从用户对MSDN页面的评论),它很慢。耻辱! –

+0

@StephenKennedy:注意到了,但如果开始导致问题并且代码对性能至关重要,我只会担心它。没有必要过早地优化任何东西。 –

相关问题