Entwerfen von Flags-Enumerationen

Flags-Enumerationen werden zum Verdecken von Bitfeldern und bitweise Vergleiche verwendet. Sie sind die geeignete Entwurfslösung, wenn gleichzeitig mehrere Enumerationswerte angegeben werden können. Beispielsweise können Sie beliebige GenericUriParserOptions-Enumerationswerte kombinieren, um einen generischen URI (Uniform Resource Identifier)-Parser zu konfigurieren.

Wenden Sie das System.FlagsAttribute auf Flags-Enumerationen an. Wenden Sie dieses Attribut nicht auf einfache Enumerationen an.

Verwenden Sie Zweierpotenzen für die Werte einer Flags-Enumeration, sodass sie mithilfe einer bitweisen OR-Operation beliebig kombiniert werden können.

Wichtiger HinweisWichtig

Wenn Sie keine Zweierpotenzen oder Kombinationen von Zweierpotenzen verwenden, werden bitweise Operationen nicht wie erwartet ausgeführt.

Stellen Sie für häufig verwendete Kombinationen von Flags besondere Enumerationswerte bereit.

Das Kombinieren der Werte von Flags-Enumerationen ist eine Aufgabe für Fortgeschrittene, die für Entwickler, die allgemeine Szenarien implementieren, nicht erforderlich sein sollte. Beispielsweise enthält die FileShare-Enumeration den ReadWrite-Wert, um anzugeben, dass eine freigegebene Datei zum Lesen oder Schreiben geöffnet werden kann. Hieran erkennen Entwickler, dass sie eine freigegebene Datei zum Lesen oder Schreiben öffnen können, und sie müssen nicht wissen, wie eine Kombination von Enumerationswerten als einzelner Wert angegeben wird.

Erstellen Sie keine Flags-Enumerationen, wenn bestimmte Kombinationen von Werten ungültig sind.

Dieses Problem deutet i. d. R. darauf hin, dass der Zweck der Enumeration nicht genau genug definiert ist. Möglicherweise empfiehlt es sich, die Enumeration in zwei oder mehr Enumerationen aufzuteilen, von denen jede einen genauer definierten Satz von Werten enthält. Betrachten Sie z. B. die folgende schlecht definierte Enumeration.

<Flags()> _
Public Enum PurchaseTypes

    SalePrice
    RegularPrice
    Book
    CompactDisk

End Enum

[Flags]
public enum PurchaseTypes
{
    SalePrice,
    RegularPrice,
    Book,
    CompactDisk
}

Der Entwickler hat diese Enumeration für die Verwendung mit der folgenden Methode vorgesehen.

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)

Beim Aufruf dieser Methode gibt der purchase-Parameter genau einen SalePrice-Wert oder RegularPrice-Wert und genau einen Book-Wert oder CompactDisk-Wert an. Entwickler können diese Anforderung nur bestimmen, wenn sie in der Dokumentation nachsehen oder mit der Methode experimentieren. In einer besseren Lösung werden die beiden Arten von Informationen getrennt und in eine jeweils eigene Enumeration eingefügt, wie im folgenden Codebeispiel veranschaulicht.

Public Enum ItemType

    Book
    CompactDisk

End Enum

Public Enum PriceType

    SalePrice
    RegularPrice

End Enum

public enum ItemType
{
    Book,
    CompactDisk
}

public enum PriceType
{
    SalePrice,
    RegularPrice,
}

Die Methodensignatur wird nicht entsprechend dem Neuentwurf geändert, wie im folgenden Codebeispiel veranschaulicht.

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)

Legen Sie einen Flags-Enumerationswert nur auf 0 (null) fest, wenn mit dem Wert angegeben werden soll, dass alle Flags gelöscht wurden. Ein solcher Wert sollte mit einem geeigneten Namen bezeichnet werden, wie in der nächsten Richtlinie beschrieben.

Beachten Sie, dass diese Richtlinie nur für Flags-Enumerationen gilt. Für einfache Enumerationen kann und muss der Wert 0 (null) verwendet werden.

Nennen Sie den Wert 0 (null) von Flags-Enumerationen None. Für eine Flags-Enumeration muss der Wert immer bedeuten, dass alle Flags gelöscht wurden.

Wichtiger HinweisWichtig

Geben Sie in einer Flags-Enumeration mit dem Wert 0 (null) keinen anderen Zustand an.Es gibt keine Möglichkeit, zu überprüfen, ob ein Flag mit dem Wert 0 (null) explizit festgelegt wurde oder ob keine Flags festgelegt wurden.

Copyright für einzelne Teile 2005 Microsoft Corporation. Alle Rechte vorbehalten.

Copyright für einzelne Teile Addison-Wesley Corporation. Alle Rechte vorbehalten.

Weitere Informationen zu Entwurfsrichtlinien finden Sie unter „Framework-Entwurfs-Richtlinien: Idiome, Konventionen und Muster für wiederverwendbare .NET-Bibliotheken von Krzysztof Cwalina“ book und Brad Abrams, veröffentlicht von Addison-Wesley, 2005.

Siehe auch

Konzepte

Enumerationsentwurf

Hinzufügen von Werten zu Enumerationen

Weitere Ressourcen

Richtlinien für den Entwurf von Typen

Entwurfsrichtlinien zum Entwickeln von Klassenbibliotheken