我从硬件接收了几个位字段。
我的代码最初是:
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; } }
等等。
哪种方法是最佳实践?如果有的话,每种方法的优缺点是什么?
编辑:我很想知道这两种方法之间是否存在任何实际差异,特别是在性能方面。我不希望征求关于编码风格的意见(除非它来自微软的指导方针),因为这会将问题视为非建设性的。感谢。答案 0 :(得分:5)
后者是最佳实践,因为它使您的代码更具可读性
答案 1 :(得分: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的更多信息。
答案 2 :(得分:1)
至少,您的第二个示例具有更好的语义,并指示代码中位的含义。代码中有一些文档用于该位。
否则,根据您的第一个示例,您将需要添加注释,因为您基本上是在捣乱魔术(位)数字,这使得代码更难以阅读,尤其是其他不熟悉它的人。即使您自己将在未来六个月内维护此代码,您可能会发现很难记住第5位的用途。