Opsommingsontwerp
Notitie
Deze inhoud wordt opnieuw afgedrukt door toestemming van Pearson Education, Inc. van Framework Design Guidelines: Conventions, Idioms en Patterns for Reusable .NET Libraries, 2nd Edition. Die editie werd in 2008 gepubliceerd en het boek is sindsdien volledig herzien in de derde editie. Sommige informatie op deze pagina is mogelijk verouderd.
Opsommingen zijn een speciaal type waarde. Er zijn twee soorten opsommingen: eenvoudige opsommingen en opsommingen van vlaggen.
Eenvoudige opsommingen vertegenwoordigen kleine gesloten sets met keuzes. Een veelvoorkomend voorbeeld van de eenvoudige opsomming is een set kleuren.
Markeringen zijn ontworpen ter ondersteuning van bitsgewijze bewerkingen op de enumwaarden. Een veelvoorkomend voorbeeld van de markeringenum is een lijst met opties.
✔️ GEBRUIK een enum om parameters, eigenschappen en retourwaarden sterk te typen die sets waarden vertegenwoordigen.
✔️ DOE een voordeel bij het gebruik van een opsomming in plaats van statische constanten.
❌ GEBRUIK GEEN opsomming voor open sets (zoals de versie van het besturingssysteem, namen van uw vrienden, enzovoort).
❌ GEEF GEEN gereserveerde enumwaarden op die zijn bedoeld voor toekomstig gebruik.
U kunt in een later stadium altijd gewoon waarden toevoegen aan de bestaande enum. Zie Waarden toevoegen aan Enums voor meer informatie over het toevoegen van waarden aan opsommingen. Gereserveerde waarden vervuilen alleen de set echte waarden en leiden meestal tot gebruikersfouten.
❌ VERMIJD het openbaar weergeven van opsommingen met slechts één waarde.
Een veelvoorkomende procedure voor het waarborgen van toekomstige uitbreidbaarheid van C-API's is het toevoegen van gereserveerde parameters aan methodehandtekeningen. Dergelijke gereserveerde parameters kunnen worden uitgedrukt als opsommingen met één standaardwaarde. Dit mag niet worden gedaan in beheerde API's. Bij overbelasting van methoden kunnen parameters worden toegevoegd in toekomstige releases.
❌ Neem geen sentinel-waarden op in opsommingen.
Hoewel ze soms nuttig zijn voor frameworkontwikkelaars, zijn sentinel-waarden verwarrend voor gebruikers van het framework. Ze worden gebruikt om de status van de enum bij te houden in plaats van een van de waarden uit de set te zijn die door de enum worden vertegenwoordigd.
✔️ DO geeft een waarde van nul op eenvoudige opsommingen.
Overweeg de waarde aan te roepen als 'Geen'. Als een dergelijke waarde niet geschikt is voor deze specifieke enum, moet de meest voorkomende standaardwaarde voor het enum worden toegewezen aan de onderliggende waarde van nul.
✔️ OVERWEEG (de standaardinstelling in de meeste programmeertalen) als het onderliggende type enum te gebruiken Int32 , tenzij een van de volgende voorwaarden waar is:
De enum is een opsomming van vlaggen en u hebt meer dan 32 vlaggen of verwacht meer in de toekomst.
Het onderliggende type moet anders zijn dan Int32 voor een eenvoudigere interoperabiliteit met onbeheerde code die verschillende opsommingen verwacht.
Een kleiner onderliggend type zou leiden tot aanzienlijke besparingen in ruimte. Als u verwacht dat de opsomming voornamelijk wordt gebruikt als argument voor de controlestroom, maakt de grootte weinig verschil. De groottebesparingen kunnen aanzienlijk zijn als:
U verwacht dat de opsomming wordt gebruikt als een veld in een zeer vaak geïnstantieerde structuur of klasse.
U verwacht dat gebruikers grote matrices of verzamelingen van de enum-exemplaren maken.
U verwacht dat een groot aantal exemplaren van de enum wordt geserialiseerd.
Voor in-memory gebruik moet u er rekening mee houden dat beheerde objecten altijd DWORD
zijn uitgelijnd, zodat u effectief meerdere opsommingen of andere kleine structuren in een instantie nodig hebt om een kleinere opsomming in te pakken om een verschil te maken, omdat de totale instantiegrootte altijd wordt afgerond op een DWORD
.
✔️ DO-naammarkeringen opsommingen met meervoud zelfstandige naamwoorden of zelfstandige naamwoordzinnen en eenvoudige opsommingen met enkelvoudige zelfstandige naamwoorden of zelfstandige naamwoordzinnen.
❌ NIET rechtstreeks uitbreiden System.Enum .
System.Enum is een speciaal type dat door de CLR wordt gebruikt om door de gebruiker gedefinieerde opsommingen te maken. De meeste programmeertalen bieden een programmeerelement waarmee u toegang hebt tot deze functionaliteit. In C# wordt bijvoorbeeld het enum
trefwoord gebruikt om een opsomming te definiëren.
Markeringen ontwerpen
✔️ DO apply the System.FlagsAttribute to flag enums. Pas dit kenmerk niet toe op eenvoudige opsommingen.
✔️ GEBRUIK de kracht van twee voor de vlag-enumwaarden, zodat ze vrij kunnen worden gecombineerd met behulp van de bitsgewijze OR-bewerking.
✔️ OVERWEEG speciale enumwaarden op te geven voor veelgebruikte combinaties van vlaggen.
Bitwise-bewerkingen zijn een geavanceerd concept en moeten niet vereist zijn voor eenvoudige taken. ReadWrite is een voorbeeld van een dergelijke speciale waarde.
❌ VERMIJD het maken van vlag-opsommingen waarbij bepaalde combinaties van waarden ongeldig zijn.
❌ VERMIJD het gebruik van vlag-enumwaarden van nul, tenzij de waarde 'alle vlaggen worden gewist' en op de juiste manier wordt genoemd, zoals voorgeschreven door de volgende richtlijn.
✔️ Geef de nulwaarde van vlag-opsommingen None
een naam. Voor een vlag-opsomming moet de waarde altijd betekenen dat alle vlaggen worden gewist.
Waarde toevoegen aan Enums
Het is heel gebruikelijk om te ontdekken dat u waarden moet toevoegen aan een enum nadat u deze al hebt verzonden. Er is een mogelijk probleem met de toepassingscompatibiliteit wanneer de nieuwe toegevoegde waarde wordt geretourneerd vanuit een bestaande API, omdat slecht geschreven toepassingen de nieuwe waarde mogelijk niet correct verwerken.
✔️ OVERWEEG waarden toe te voegen aan opsommingen, ondanks een klein compatibiliteitsrisico.
Als u echte gegevens hebt over incompatibiliteit van toepassingen die worden veroorzaakt door toevoegingen aan een enum, kunt u overwegen een nieuwe API toe te voegen die de nieuwe en oude waarden retourneert en de oude API afschadigt, die alleen de oude waarden zou moeten retourneren. Dit zorgt ervoor dat uw bestaande toepassingen compatibel blijven.
© Delen 2005, 2009 Microsoft Corporation. Alle rechten voorbehouden.
Herdrukt door toestemming van Pearson Education, Inc. van Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published oct 22, 2008 by Addison-Wesley Professional als onderdeel van de Microsoft Windows Development Series.