Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Dieser Inhalt wird mit Genehmigung von Pearson Education, Inc. aus Framework Design Guidelines: Konventionen, Idiome und Muster für wiederverwendbare .NET-Bibliotheken, 2. Auflage nachgedruckt. Diese Ausgabe wurde 2008 veröffentlicht, und das Buch wurde seitdem in der dritten Ausgabe vollständig überarbeitet. Einige der Informationen auf dieser Seite sind möglicherweise veraltet.
Enumerationen sind eine besondere Art von Werttyp. Es gibt zwei Arten von Enums: einfache Enums und Flag-Enums.
Einfache Enumerationen stellen kleine, geschlossene Auswahlmöglichkeiten dar. Ein gängiges Beispiel für eine einfache Enumeration ist eine Reihe von Farben.
Flag-Enums sind so entwickelt, dass bitweise Operationen auf den Enum-Werten unterstützt werden. Ein gängiges Beispiel für die Flagenumeration ist eine Liste von Optionen.
✔️ Verwenden Sie eine Enumeration, um Parameter, Eigenschaften und Rückgabewerte, die Wertesätze darstellen, stark zu typisieren.
✔️ Bevorzugen Sie die Verwendung einer Enumeration anstelle von statischen Konstanten.
❌ Verwenden Sie kein Enum für offene Sets (z. B. die Betriebssystemversion, die Namen Ihrer Freunde usw.).
❌ Geben Sie KEINE reservierten Enum-Werte an, die für die zukünftige Verwendung vorgesehen sind.
Sie können jederzeit einfach Werte zu dem vorhandenen Enum zu einem späteren Zeitpunkt hinzufügen. Weitere Informationen zum Hinzufügen von Werten zu Enumerationen finden Sie unter "Hinzufügen von Werten zu Enumerationen". Reservierte Werte verunreinigt lediglich den Satz realer Werte und führen dazu, dass Benutzerfehler auftreten.
❌ Vermeiden Sie es, Enums mit nur einem einzigen Wert öffentlich zur Verfügung zu stellen.
Eine gängige Methode zum Sicherstellen der zukünftigen Erweiterbarkeit von C-APIs besteht darin, reservierte Parameter zu Methodensignaturen hinzuzufügen. Solche reservierten Parameter können als Enumerationen mit einem einzelnen Standardwert ausgedrückt werden. Dies sollte nicht in verwalteten APIs erfolgen. Die Methodenüberladung ermöglicht das Hinzufügen von Parametern in zukünftigen Versionen.
❌ Schließen Sie keine Sentinel-Werte in Enums ein.
Obwohl sie manchmal hilfreich für Frameworkentwickler sind, sind Sentinelwerte für Benutzer des Frameworks verwirrend. Sie werden verwendet, um den Zustand des Enums nachzuverfolgen, anstatt ein Wert aus dem Satz zu sein, der durch das Enum dargestellt wird.
✔️ DO stellt einen Wert von Null für einfache Enumerationen bereit.
Erwägen Sie, den Wert als "None" zu benennen. Wenn ein solcher Wert für dieses bestimmte Enum nicht geeignet ist, sollte der am häufigsten verwendete Standardwert für das Enum den zugrunde liegenden Wert von Null erhalten.
✔️ ERWÄGEN Sie die Verwendung von Int32 (der Standardwert in den meisten Programmiersprachen) als zugrunde liegenden Typ einer Enumeration, es sei denn, einer der folgenden Punkte trifft zu:
Die Enumeration ist eine Flagenumeration, und Sie verwenden mehr als 32 Flags oder erwarten, dass sie in Zukunft weitere Flags verwenden werden.
Der zugrunde liegende Typ muss anders sein als Int32 für die einfachere Interoperabilität mit nicht verwalteten Code, der unterschiedliche Größen-Enumerationen erwartet.
Ein kleinerer zugrunde liegender Typ würde zu erheblichen Einsparungen im Raum führen. Wenn Sie erwarten, dass das Enum hauptsächlich als Argument für den Steuerungsfluss verwendet wird, macht die Größe kaum einen Unterschied. Die Größeneinsparungen können erheblich sein, wenn:
Sie erwarten, dass das Enum als Feld in einer sehr oft instanziierten Struktur oder Klasse verwendet wird.
Sie erwarten, dass Benutzer große Arrays oder Sammlungen von Enum-Instanzen erstellen.
Sie erwarten, dass eine große Anzahl von Instanzen der Enumeration serialisiert wird.
Für die In-Memory-Nutzung ist zu beachten, dass verwaltete Objekte immer an DWORD
ausgerichtet sind, sodass Sie effektiv mehrere Enumerationen oder andere kleine Strukturen in einer Instanz benötigen, um eine kleinere Enumeration darin zu packen und so einen Unterschied zu bewirken, weil die Gesamtgröße der Instanz immer auf DWORD
aufgerundet wird.
✔️ BENENNEN Sie Flagenumerationen mit Substantiven im Plural oder Substantivausdrücken und einfache Enumerationen mit Substantiven im Singular oder Substantivausdrücken.
❌ Erweitern Sie System.Enum NICHT direkt.
System.Enum ist ein spezieller Typ, der vom CLR zum Erstellen benutzerdefinierter Enumerationen verwendet wird. Die meisten Programmiersprachen bieten ein Programmierelement, mit dem Sie auf diese Funktionalität zugreifen können. Beispielsweise wird in C# das enum
Schlüsselwort verwendet, um eine Enumeration zu definieren.
Entwerfen von Flagenumerationen
✔️ WENDEN Sie die System.FlagsAttribute auf Flagenumerationen AN. Wenden Sie dieses Attribut nicht auf einfache Enumerationen an.
✔️ VERWENDEN Sie Zweierpotenzen für die Flagenumerationswerte, damit sie mithilfe des bitweisen OR-Vorgangs frei kombiniert werden können.
✔️ ERWÄGEN SIE, spezielle Enum-Werte für häufig verwendete Kombinationen von Flags bereitzustellen.
Bitweise Vorgänge sind ein erweitertes Konzept und sollten nicht für einfache Aufgaben erforderlich sein. ReadWrite ist ein Beispiel für einen solchen speziellen Wert.
❌ VERMEIDEN Sie das Erstellen von Flag-Enumerationen, bei denen bestimmte Wertekombinationen ungültig sind.
❌ VERMEIDEN Sie die Verwendung von Flag-Enumerationswerten von Null, es sei denn, der Wert stellt "alle Flags sind gelöscht" dar und wird entsprechend benannt, wie in der nächsten Richtlinie festgelegt.
✔️ NENNEN Sie den NULL-Wert von Flagenumerationen None
. Bei einer Flagenumeration muss der Wert immer „alle Flags sind gelöscht“ bedeuten.
Hinzufügen von Werten zu Enumerationen
Sehr häufig wird festgestellt, dass Sie einer Enumeration Werte hinzufügen müssen, nachdem Sie sie bereits bereitgestellt haben. Es besteht ein potenzielles Anwendungskompatibilitätsproblem, wenn der neu hinzugefügte Wert von einer vorhandenen API zurückgegeben wird, da schlecht geschriebene Anwendungen den neuen Wert möglicherweise nicht ordnungsgemäß verarbeiten.
✔️ Erwägen Sie, Werte zu Enums hinzuzufügen, trotz eines geringen Kompatibilitätsrisikos.
Wenn Sie echte Daten zu Anwendungsinkompatibilitäten haben, die durch Ergänzungen zu einer Enumeration verursacht werden, betrachten Sie das Hinzufügen einer neuen API, die die neuen und alten Werte zurückgibt, und verwerfen Sie die alte API, die weiterhin nur die alten Werte zurückgeben sollte. Dadurch wird sichergestellt, dass Ihre vorhandenen Anwendungen kompatibel bleiben.
© Teile 2005, 2009 Microsoft Corporation. Alle Rechte vorbehalten.
Nachdruck mit freundlicher Genehmigung von Pearson Education, Inc., aus dem Buch Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition von Krzysztof Cwalina und Brad Abrams, veröffentlicht am 22. Oktober 2008 von Addison-Wesley Professional als Teil der Microsoft Windows Development Series.