Dela via


Enum-design

Anmärkning

Det här innehållet skrivs om med behörighet från Pearson Education, Inc. från Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Den utgåvan publicerades 2008, och boken har sedan dess reviderats helt i den tredje utgåvan. En del av informationen på den här sidan kan vara inaktuell.

Uppräkningar är en särskild typ av värdetyp. Det finns två typer av enums: enkla enums och flagg-enums.

Enkla enum representerar små stängda uppsättningar av valmöjligheter. Ett vanligt exempel på en enkel enumerering är en uppsättning färger.

Flagguppräkningar är utformade för att stödja bitvis åtgärder på uppräkningsvärdena. Ett vanligt exempel på en flagguppsättning är en lista över valmöjligheter.

✔️ Använd en uppräkning för att ange parametrar, egenskaper och returvärden som representerar uppsättningar med värden.

Föredra att använda en uppräkningstyp i stället för statiska konstanter.

❌ Använd INTE en uppräkning för öppna uppsättningar (till exempel operativsystemversionen, namn på dina vänner osv.).

❌ Ange INTE reserverade uppräkningsvärden som är avsedda för framtida användning.

Du kan alltid enkelt lägga till värden i den befintliga uppräkningen i ett senare skede. Mer information om hur du lägger till värden i uppräkningar finns i Lägga till värden i uppräkningar. Reserverade värden förorenar bara uppsättningen med verkliga värden och tenderar att leda till användarfel.

❌ UNDVIK att offentligt exponera uppräkningar med endast ett värde.

En vanlig metod för att säkerställa framtida utökningsbarhet för C-API:er är att lägga till reserverade parametrar i metodsignaturer. Sådana reserverade parametrar kan uttryckas som uppräkningar med ett enda standardvärde. Detta bör inte göras i hanterade API:er. Med metodöverlagring kan du lägga till parametrar i framtida versioner.

❌ Inkludera INTE sentinel-värden i uppräkningar.

Även om de ibland är användbara för ramverksutvecklare är sentinel-värden förvirrande för användare av ramverket. De används för att spåra enum-tillståndet i stället för att vara ett av värdena från uppsättningen som representeras av enum.

✔️ Ange värdet noll för enkla uppräkningar.

Överväg att kalla värdet något i stil med "Ingen". Om ett sådant värde inte är lämpligt för just den här uppräkningen bör det vanligaste standardvärdet för uppräkningen tilldelas det underliggande värdet noll.

✔️ ÖVERVÄG att använda Int32 (standardvärdet i de flesta programmeringsspråk) som den underliggande typen av en uppräkning om inget av följande är sant:

  • Uppräkningen (enum) är en uppräkning av flaggor och du har fler än 32 flaggor, eller förväntar dig att ha fler i framtiden.

  • Den underliggande typen måste skilja sig från Int32 för att underlätta interoperabilitet med icke-hanterad kod som förväntar sig uppräkningstyper av olika storlekar.

  • En mindre underliggande typ skulle leda till betydande besparingar i utrymmet. Om du förväntar dig att uppräkningen huvudsakligen ska användas som ett argument för kontrollflödet gör storleken liten skillnad. Storleksbesparingarna kan vara betydande om:

    • Du förväntar dig att uppräkningen ska användas som ett fält i en mycket ofta instansierad struktur eller klass.

    • Du förväntar dig att användarna skapar stora matriser eller samlingar av enumerationsinstanser.

    • Du förväntar dig att ett stort antal instanser av uppräkningen ska serialiseras.

För minnesanvändning bör du vara medveten om att hanterade objekt alltid är justerade enligt DWORD, så du behöver faktiskt flera uppräkningar eller andra små strukturer i en instans för att packa in en mindre uppräkning för att göra någon skillnad, eftersom den totala instansstorleken alltid kommer att avrundas till närmaste DWORD.

✔️ DO namnge flagguppräkningar med plural substantivfraser och enkla uppräkningar med singular substantivfraser.

❌ UTÖKA System.Enum INTE direkt.

System.Enum är en särskild typ som används av CLR för att skapa användardefinierade uppräkningar. De flesta programmeringsspråk tillhandahåller ett programmeringselement som ger dig åtkomst till den här funktionen. I C# används nyckelordet enum till exempel för att definiera en uppräkning.

Designa flaggenum

✔️ ANVÄND System.FlagsAttribute för flagguppräkningar. Använd inte det här attributet för enkla uppräkningar.

✔️ Använd tvåpotenser för värdena i flagguppenumerationen så att de kan kombineras fritt med hjälp av bitvis ELLER-operationen.

✔️ ÖVERVÄG att tillhandahålla särskilda enumerationsvärden för vanliga kombinationer av flaggor.

Bitvis-åtgärder är ett avancerat begrepp och bör inte krävas för enkla uppgifter. ReadWrite är ett exempel på ett sådant specialvärde.

❌ UNDVIK att skapa flagguppräkningar där vissa kombinationer av värden är ogiltiga.

❌ UNDVIK att använda flagguppräkningsvärden på noll om inte värdet representerar "alla flaggor rensas" och namnges på lämpligt sätt, enligt nästa riktlinje.

✔️ Ange nollvärdet för flagguppställning None. För en flagguppräkning måste värdet alltid betyda "alla flaggor rensas".

Lägga till värde i uppräkningar

Det är mycket vanligt att upptäcka att du måste lägga till värden i en enum-typ när du redan har skickat ut det. Det finns ett potentiellt programkompatibilitetsproblem när det nyligen tillagda värdet returneras från ett befintligt API, eftersom dåligt skrivna program kanske inte hanterar det nya värdet korrekt.

✔️ ÖVERVÄG att lägga till värden i uppräkningar, trots en liten kompatibilitetsrisk.

Om du har verkliga data om programkompatibilitetsproblem som orsakas av tillägg till en enumeration, överväg att lägga till ett nytt API som returnerar både de nya och gamla värdena. Avveckla det gamla API:et, som bör fortsätta att returnera endast de gamla värdena. Detta säkerställer att dina befintliga program förblir kompatibla.

Portioner © 2005, 2009 Microsoft Corporation. Alla rättigheter reserverade.

Återtryckt med tillstånd från Pearson Education, Inc. från Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition av Krzysztof Cwalina och Brad Abrams, publicerades den 22 oktober 2008 av Addison-Wesley Professional som en del av Microsoft Windows Development Series.

Se även