Enum-Entwurf

Hinweis

Diese Inhalte wurden mit Genehmigung von Pearson Education, Inc. aus Framework Design Guidelines nachgedruckt: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. 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 Enumerationen: einfache Enumerationen und Flagenumerationen.

Einfache Enumerationen stellen kleine, geschlossene Auswahlmöglichkeiten dar. Ein gängiges Beispiel für eine einfache Enumeration ist eine Reihe von Farben.

Flagenumerationen sind so konzipiert, dass sie bitweise Vorgänge für die Enumerationswerte unterstützen. 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 KEINE Enumeration für offene Sätze (z. B. Betriebssystemversion, Namen Ihrer Freunde usw.).

❌ Geben Sie KEINE reservierten Enumerationswerte an, die für zukünftige Verwendung bestimmt sind.

Sie können der vorhandenen Enumeration immer zu einem späteren Zeitpunkt einfach Werte hinzufügen. Weitere Informationen zum Hinzufügen von Werten zu Enumerationen finden Sie unter Hinzufügen von Werten zu Enumerationen. Reservierte Werte verunreinigen nur den Satz der realen Werte und führen in der Regel zu Benutzerfehlern.

❌ VERMEIDEN Sie die öffentliche Offenlegung von Enumerationen mit nur einem Wert.

Eine gängige Praxis zum Sicherstellen der zukünftigen Erweiterbarkeit von C-APIs besteht im Hinzufügen reservierter Parameter zu Methodensignaturen. Solche reservierten Parameter können als Enumerationen mit einem einzelnen Standardwert ausgedrückt werden. Dies sollte nicht in verwalteten APIs erfolgen. Methodenüberladung ermöglicht das Hinzufügen von Parametern in zukünftigen Releases.

❌ Schließen Sie KEINE Sentinelwerte in Enumerationen ein.

Obwohl sie manchmal für Frameworkentwickler hilfreich sind, sind Sentinelwerte für Benutzer des Frameworks verwirrend. Sie werden verwendet, um den Zustand der Enumeration nachzuverfolgen, anstatt einer der Werte aus dem durch die Enumeration dargestellten Satz zu sein.

✔️ STELLEN Sie für einfache Enumerationen den Wert NULL bereit.

Erwägen Sie, den Wert z. B. „None“ zu nennen. Wenn ein solcher Wert für diese bestimmte Enumeration nicht geeignet ist, sollte dem gängigsten Standardwert für die Enumeration der zugrunde liegende Wert NULL zugewiesen werden.

✔️ 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 sich von Int32 unterscheiden, um einfachere Interoperabilität mit nicht verwaltetem Code bereitzustellen, bei dem Enumerationen unterschiedlicher Größe erwartet werden.

  • Ein kleinerer zugrunde liegender Typ würde zu erheblichen Platzeinsparungen führen. Wenn Sie erwarten, dass die Enumeration 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 Folgendes zutrifft:

    • Sie erwarten, dass die Enumeration als Feld in einer sehr häufig instanziierten Struktur oder Klasse verwendet wird.

    • Sie erwarten, dass Benutzer große Arrays oder Sammlungen der Enumerationsinstanzen 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 von der CLR zum Erstellen benutzerdefinierter Enumerationen verwendet wird. Die meisten Programmiersprachen bieten ein Programmierelement, das Ihnen Zugriff auf diese Funktionalität ermöglicht. In C# wird beispielsweise das Schlüsselwort enum 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 die Bereitstellung spezieller Enumerationswerte für häufig verwendete Kombinationen von Flags.

Bitweise Vorgänge sind ein erweitertes Konzept und sollten für einfache Aufgaben nicht erforderlich sein. ReadWrite ist ein Beispiel für einen solchen speziellen Wert.

❌ VERMEIDEN Sie das Erstellen von Flagenumerationen, bei denen bestimmte Kombinationen von Werten ungültig sind.

❌ VERMEIDEN Sie die Verwendung von Flagenumerationswerten von NULL, es sei denn, der Wert stellt die Aussage „alle Flags werden gelöscht“ dar und wird entsprechend benannt, wie in der nächsten Richtlinie vorgeschrieben.

✔️ 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 gibt ein potenzielles Anwendungskompatibilitätsproblem, wenn der neu hinzugefügte Wert von einer vorhandenen API zurückgegeben wird, weil schlecht geschriebene Anwendungen den neuen Wert möglicherweise nicht ordnungsgemäß verarbeiten.

✔️ ERWÄGEN Sie, Enumerationen trotz eines geringen Kompatibilitätsrisikos Werte hinzuzufügen.

Wenn Sie echte Daten zu Anwendungsinkompatibilitäten haben, die durch Hinzufügungen zu einer Enumeration verursacht werden, sollten Sie in Erwägung ziehen, eine neue API hinzuzufügen, die die neuen und alten Werte zurückgibt, und die alte API, die weiterhin nur die alten Werte zurückgeben sollte, zu verwerfen. Dadurch wird sichergestellt, dass Ihre vorhandenen Anwendungen kompatibel bleiben.

Teile ©2005, 2009 Microsoft Corporation. Alle Rechte vorbehalten.

Nachdruck mit Genehmigung von Pearson Education, Inc aus 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 durch Addison-Wesley Professional als Teil der Microsoft Windows Development Series.

Weitere Informationen