Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Tips/Råd
Är du nybörjare på att utveckla programvara? Börja med självstudierna Komma igång först. Du kommer att stöta på enumar (uppräkningar) när du behöver representera en fast uppsättning val i din kod.
Har du erfarenhet av ett annat språk? C#-uppräkningar fungerar på samma sätt som uppräkningar i Java eller C++, med ytterligare stöd för bitflaggor och mönstermatchning. Skumma sektionerna flaggor och switch-uttryck för C#-specifika mönster.
En uppräkningstyp (eller uppräkning) definierar en uppsättning namngivna konstanter som backas upp av ett heltalsvärde. Använd uppräkningar när ett värde måste vara ett av en fast uppsättning alternativ – veckodagar, HTTP-statuskoder, loggnivåer eller vägbeskrivningar. Uppräkningar gör koden mer läsbar och mindre felbenägen än råa heltalskonstanter eftersom kompilatorn tillämpar de namngivna värdena.
Deklarera en uppräkning
Definiera en uppräkning med nyckelordet enum följt av typnamnet och dess medlemmar:
enum Season
{
Spring,
Summer,
Autumn,
Winter
}
Som standard är intden underliggande typen , och värdena börjar vid 0 och ökar med en.
Season.Spring är 0, Season.Summer är 1och så vidare.
Ange en underliggande typ och explicita värden
Du kan välja en annan integrerad typ och tilldela explicita värden för att styra den numeriska representationen:
enum HttpStatus : ushort
{
OK = 200,
NotFound = 404,
InternalServerError = 500
}
Använd explicita värden när talen har extern betydelse, till exempel HTTP-statuskoder eller protokollidentifierare. Den underliggande typen kan vara valfri integraltyp utom char. Använd byte, short, ushort, int, uint, longeller ulong.
Använd uppräkningar i switchuttryck
Enum fungerar naturligt med switch uttryck och mönstermatchning. Kompilatorn varnar dig om du inte hanterar alla medlemmar, vilket hjälper till att förhindra buggar när du lägger till ett nytt värde senare:
static string DescribeSeason(Season season) => season switch
{
Season.Spring => "Flowers bloom and temperatures rise.",
Season.Summer => "Long days and warm weather.",
Season.Autumn => "Leaves change color and fall.",
Season.Winter => "Short days and cold temperatures.",
_ => throw new ArgumentOutOfRangeException(nameof(season))
};
var today = Season.Autumn;
Console.WriteLine(DescribeSeason(today));
Mönstret ignorera (_) hanterar alla värden som inte uttryckligen anges.
Mönstermatchning är en C#-funktion som testar ett värde mot en form eller ett villkor. I det här exemplet kontrollerar varje case om uppräkningen matchar ett specifikt element. Switch-uttryck är en av flera mönstermatchningstyper. Mer information om mönstermatchning finns i Mönstermatchning.
Bitflaggor
När en uppräkning representerar en kombination av val i stället för ett enda val definierar du varje medlem som en tvåpotens och tillämpar FlagsAttribute:
[Flags]
enum FileAccess
{
None = 0,
Read = 1,
Write = 2,
Execute = 4,
ReadWrite = Read | Write,
All = Read | Write | Execute
}
Kombinera värden med hjälp av operatorn | och testa för enskilda flaggor med hjälp HasFlagav :
var permissions = FileAccess.Read | FileAccess.Write;
Console.WriteLine(permissions); // ReadWrite
Console.WriteLine(permissions.HasFlag(FileAccess.Read)); // True
Console.WriteLine(permissions.HasFlag(FileAccess.Execute)); // False
Attributet [Flags] påverkar ToString()också . Den visar kombinerade värden som kommaavgränsade namn (t.ex Read, Write. ) i stället för ett raw-tal. Mer information finns i System.FlagsAttribute.
Konvertera mellan enum och heltal
Explicita casts konverterar mellan en enum och dess underliggande heltalstyp.
var status = HttpStatus.NotFound;
ushort code = (ushort)status;
Console.WriteLine($"Status: {status} ({code})"); // Status: NotFound (404)
var fromCode = (HttpStatus)200;
Console.WriteLine(fromCode); // OK
Tänk på att typkonvertering av ett heltal till en uppräkningstyp inte verifierar om värdet matchar en definierad medlem av uppräkningen. Använd Enum.IsDefined för att kontrollera giltigheten när du accepterar numeriska indata från externa källor.
Parsa strängar och iterera värden
Basklassen Enum innehåller metoder för att parsa strängar och iterera över alla definierade värden:
// Parse a string to an enum value:
var parsed = Enum.Parse<Season>("Winter");
Console.WriteLine(parsed); // Winter
// Try to parse safely. It returns false only when the input can't be parsed. Call Enum.IsDefined to validate named members:
if (Enum.TryParse<Season>("Monsoon", out var unknown))
{
Console.WriteLine(unknown);
}
else
{
Console.WriteLine("'Monsoon' is not a valid Season"); // 'Monsoon' is not a valid Season
}
// Iterate over all values in an enum:
foreach (var season in Enum.GetValues<Season>())
{
Console.WriteLine($"{season} = {(int)season}");
}
// Spring = 0
// Summer = 1
// Autumn = 2
// Winter = 3
Använd Enum.TryParse<TEnum>(String, Boolean, TEnum) i stället för Enum.Parse<TEnum>(String) när indata kan vara ogiltiga. Den returnerar false i stället för att utlösa ett undantag.