Enumerationsentwurf

Enumerationen stellen Sätze von konstanten Werten bereit, die sich für die starke Typisierung von Membern und die Verbesserung der Lesbarkeit von Code empfehlen. Enumerationen sind entweder einfache Enumerationen oder Flags-Enumerationen. Einfache Enumerationen enthalten Werte, die weder kombiniert noch in bitweisen Vergleichen verwendet werden. Flags-Enumerationen werden mithilfe von OR-Operationen kombiniert. Kombinationen von Flags-Enumerationswerten werden mit bitweisen AND-Operationen überprüft.

In den folgenden Richtlinien werden die empfohlenen Vorgehensweisen für den Enumerationsentwurf beschrieben.

Verwenden Sie eine Enumeration, um Parameter, Eigenschaften und Rückgabewerte stark zu typisieren, die Sätze von Werten darstellen.

Verwenden Sie statt statischer Konstanten eine Enumeration.

Im folgenden Codebeispiel wird ein falscher Entwurf veranschaulicht.

Public Class BadFurnishings

    Public Shared Table As Integer = 1
    Public Shared Chair As Integer = 2
    Public Shared Lamp As Integer = 3

End Class
public static class BadFurnishings
{
    public static int Table = 1;
    public static int Chair = 2;
    public static int Lamp = 3;
}

Im folgenden Codebeispiel wird die Enumeration veranschaulicht, die anstelle von statischen Konstanten verwendet werden sollte.

Public Enum GoodFurnishings

    Table
    Chair
    Lamp

End Enum
public enum GoodFurnishings
{
    Table,
    Chair,
    Lamp
}

Verwenden Sie keine Enumeration für offene Sätze, z. B. die Betriebssystemversion.

Durch das Hinzufügen von Werten zu einer Enumeration, die bereits veröffentlicht wurde, kann die Konsistenz von Code zerstört werden. Dies ist zuweilen zulässig, entwerfen Sie jedoch keine Enumeration, wenn zu erwarten ist, dass dieser Fall eintritt.

Definieren Sie keine reservierten Enumerationswerte, die für die zukünftige Verwendung bestimmt sind.

In einigen Situationen können Sie bestimmen, dass das Risiko, die Konsistenz des Codes zu zerstören, in Kauf genommen werden muss, um einer veröffentlichten Enumeration Werte hinzufügen zu können. Sie können auch eine neue Enumeration und Member definieren, die mit ihren Werten ausgeführt werden.

Machen Sie keine Enumerationen mit nur einem Wert öffentlich verfügbar.

Fügen Sie keine Sentinelwerte in Enumerationen ein.

Mit Sentinelwerten werden die Grenzen von Werten in der Enumeration bezeichnet. Ein Sentinelwert wird i. d. R. für die Bereichsüberprüfung verwendet und ist kein gültiger Datenwert. Im folgenden Codebeispiel wird eine Enumeration mit einem Sentinelwert definiert.

Public Enum Furniture

    Desk
    Chair
    Lamp
    Rug
    LastValue

End Enum

public enum Furniture
{
    Desk,
    Chair,
    Lamp,
    Rug,
    LastValue   // The sentinel value.
}

Stellen Sie für einfache Enumerationen den Wert 0 (null) bereit.

Legen Sie für diesen Wert nach Möglichkeit den Namen None fest. Wenn None nicht geeignet ist, weisen Sie den Wert 0 (null) dem am häufigsten verwendeten Wert (Standardwert) zu.

Verwenden Sie System.Int32 (der Standarddatentyp in den meisten Programmiersprachen) als zugrunde liegenden Datenyp einer Enumeration, sofern keine der folgenden Bedingungen zutrifft:

  • Die Enumeration ist eine Flags-Enumeration, und es sind mehr als 32 Flags vorhanden oder voraussichtlich zukünftig vorhanden.

  • Der zugrunde liegende Typ darf nicht Int32 sein, um die Interoperabilität mit nicht verwaltetem Code, der voraussichtlich Enumerationen unterschiedlicher Größe enthält, zu erhöhen.

  • Ein kleinerer zugrunde liegender Typ führt zu wesentlicher Einsparung an Speicherplatz. Wenn eine Enumeration voraussichtlich hauptsächlich als Argument für die Ablaufsteuerung verwendet wird, wirkt sich die Größe kaum aus. Die Größeneinsparung kann unter folgenden Bedingungen beträchtlich sein:

    • Die Enumeration wird voraussichtlich in jeder häufig instanziierten Struktur oder Klasse als Feld verwendet.

    • Sie erwarten, dass Benutzer umfangreiche Arrays oder Auflistungen von Enumerationsinstanzen erstellen.

    • Sie erwarten, dass eine große Anzahl von Instanzen der Enumeration serialisiert wird.

Verwenden Sie für die Namen von Flags-Enumerationen Substantive oder substantivische Ausdrücke im Plural. Verwenden Sie für die Namen einfacher Enumerationen Substantive oder substantivische Ausdrücke im Singular.

Erweitern Sie System.Enum nicht direkt.

Einige Compiler lassen das Erweitern von Enum nur zu, wenn dies indirekt mit dem sprachspezifischen Schlüsselwort zum Generieren von Enumerationen erfolgt.

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

Entwerfen von Flags-Enumerationen

Hinzufügen von Werten zu Enumerationen

Weitere Ressourcen

Richtlinien für den Entwurf von Typen

Entwurfsrichtlinien zum Entwickeln von Klassenbibliotheken