共用方式為


設計旗標列舉型別

更新: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 程式庫的慣例、慣用語法和模式」一書。

請參閱

概念

列舉型別設計

將值加入至列舉型別

其他資源

型別設計方針

開發類別庫的設計方針