2011-10-26 86 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:注意到了,但如果開始導致問題並且代碼對性能至關重要,我只會擔心它。沒有必要過早地優化任何東西。 –

相關問題