設計旗標列舉型別
更新:2007 年 11 月
旗標列舉型別會用來為位元 (Bit) 欄位提供遮罩以及執行位元 (Bitwise) 比較,也是同時可以指定多個列舉值時所用的正確設計。例如,您可結合任何 GenericUriParserOptions 列舉值,以設定泛型統一資源識別元 (URI) 剖析器。
一定要使用旗標列舉值的 2 的次方,讓它們可以使用位元 OR 運算自由結合。
重要事項: |
---|
如果您不使用 2 的次方或 2 的次方組合,則位元運算將不會如預期般運作。 |
請考慮為常用的旗標組合提供特殊的列舉值。
結合旗標列舉值是一項中級的技術,應該不需要讓開發人員實作常見案例。例如,FileShare 列舉型別包含了 ReadWrite 值,以指定可開啟共用檔案來讀取或寫入。如此可讓開發人員知道,他們可以開啟共用檔案來讀取或寫入,而且他們不再需要學習如何將列舉值組合指定為單一值。
避免在某些值組合無效時建立旗標列舉型別。
這個問題通常表示,此列舉型別的意義不夠精確;請考慮將此列舉型別分成兩個或多個列舉型別,其中每一個列舉型別都有更精確的一組值。例如,假設有下列定義不良的列舉型別。
<Flags()> _
Public Enum PurchaseTypes
SalePrice
RegularPrice
Book
CompactDisk
End Enum
[Flags]
public enum PurchaseTypes
{
SalePrice,
RegularPrice,
Book,
CompactDisk
}
設計工具希望將此列舉型別與下列方法一起使用。
Public Overloads Function FindPriceForItem(ByVal title As String, ByVal purchase As PurchaseTypes) As Single
Return 0
End Function
public float FindPriceForItem(string title, PurchaseTypes purchase)
當呼叫這個方法時,purchase 參數會剛好指定 SalePrice 或 RegularPrice 值的其中一個,以及 Book 或 CompactDisk 值的其中一個。開發人員如果不查閱文件或使用此方法,將無法判斷這項需求。一個較好的方法是將這兩種資訊分開,將每一種資訊放在它自己的列舉型別中,如下列程式碼範例所示。
Public Enum ItemType
Book
CompactDisk
End Enum
Public Enum PriceType
SalePrice
RegularPrice
End Enum
public enum ItemType
{
Book,
CompactDisk
}
public enum PriceType
{
SalePrice,
RegularPrice,
}
現在會變更此方法簽章來反映此重新設計,如下列程式碼範例所示。
Public Overloads Function FindPriceForItem(ByVal title As String, ByVal name As ItemType, ByVal price As PriceType) As Single
Return 0
End Function
public float FindPriceForItem(string title, ItemType name, PriceType price)
避免將旗標列舉值設定為零,除非要使用該值來指示要清除所有旗標。應該依照下一個方針中所述的步驟,適當地將這類值命名。
請注意,此方針僅適用於旗標列舉型別;簡單列舉型別可以 (也應該) 使用零的值。
一定要將旗標列舉型別的零值命名為 None。如果是旗標列舉型別,這個值一定要表示所有的旗標都要清除。
重要事項: |
---|
請勿在旗標列舉型別中使用零的值來指示任何其他狀態,您無法檢查是否有明確設定零值旗標,因為這與未設定任何旗標不符合。 |
Portions Copyright 2005 Microsoft Corporation.All rights reserved.
Portions Copyright Addison-Wesley Corporation.All rights reserved.
如需設計方針的詳細資訊,請參閱由 Krzysztof Cwalina 和 Brad Abrams 所著,並由 Addison-Wesley 於 2005 年發行的「Framework 設計方針:可重複使用之 .NET 程式庫的慣例、慣用語法和模式」一書。