Výčtové typy (Referenční dokumentace jazyka C#)
Výčtový typ (nebo typ výčtu) je typ hodnoty definovaný sadou pojmenovaných konstant základního integrálního číselného typu. Chcete-li definovat typ výčtu, použijte enum klíčové slovo a zadejte názvy členů výčtu:
enum Season
{
Spring,
Summer,
Autumn,
Winter
}
Ve výchozím nastavení jsou přidružené konstantní hodnoty členů výčtu typu, int začínají nulou a navýšené o jednu za pořadí textu definice. Můžete explicitně zadat jakýkoli jiný integrální číselný typ jako nadřízený typ výčtového typu. Můžete také explicitně zadat přidružené konstantní hodnoty, jak ukazuje následující příklad:
enum ErrorCode : ushort
{
None = 0,
Unknown = 1,
ConnectionLost = 100,
OutlierReading = 200
}
V definici typu výčtu nelze definovat metodu. Chcete-li přidat funkci do výčtového typu, vytvořte metodu rozšíření.
Výchozí hodnota výčtového typu E je hodnota vytvářená výrazem (E)0 , i když nula nemá odpovídajícího člena výčtu.
Typ výčtu můžete použít k reprezentaci výběru ze sady vzájemně se vylučujících hodnot nebo kombinací možností. Pro reprezentaci kombinace voleb Definujte typ výčtu jako bitové příznaky.
Výčtové typy jako bitové příznaky
Chcete-li, aby typ výčtu představoval kombinaci možností, definujte členy výčtu pro tyto možnosti tak, aby jednotlivá volba byla bitového pole. To znamená, že přidružené hodnoty těchto členů výčtu by měly být mocninou dvou. Pak můžete použít bitové logické operátory | nebo & pro kombinování voleb nebo průsečíku kombinací voleb v uvedeném pořadí. Chcete-li označit, že typ výčtu deklaruje bitová pole, použijte atribut Flags na něj. Jak ukazuje následující příklad, můžete také zahrnout některé typické kombinace v definici výčtového typu.
[Flags]
public enum Days
{
None = 0b_0000_0000, // 0
Monday = 0b_0000_0001, // 1
Tuesday = 0b_0000_0010, // 2
Wednesday = 0b_0000_0100, // 4
Thursday = 0b_0000_1000, // 8
Friday = 0b_0001_0000, // 16
Saturday = 0b_0010_0000, // 32
Sunday = 0b_0100_0000, // 64
Weekend = Saturday | Sunday
}
public class FlagsEnumExample
{
public static void Main()
{
Days meetingDays = Days.Monday | Days.Wednesday | Days.Friday;
Console.WriteLine(meetingDays);
// Output:
// Monday, Wednesday, Friday
Days workingFromHomeDays = Days.Thursday | Days.Friday;
Console.WriteLine($"Join a meeting by phone on {meetingDays & workingFromHomeDays}");
// Output:
// Join a meeting by phone on Friday
bool isMeetingOnTuesday = (meetingDays & Days.Tuesday) == Days.Tuesday;
Console.WriteLine($"Is there a meeting on Tuesday: {isMeetingOnTuesday}");
// Output:
// Is there a meeting on Tuesday: False
var a = (Days)37;
Console.WriteLine(a);
// Output:
// Monday, Wednesday, Saturday
}
}
Další informace a příklady naleznete na System.FlagsAttribute stránce Reference k rozhraní API a na nevýhradních členech a v části atributu flags na System.Enum referenční stránce rozhraní API.
Typ System. Enum a omezení výčtu
System.EnumTyp je abstraktní základní třída všech výčtových typů. Poskytuje několik metod pro získání informací o typu výčtu a jeho hodnotách. Další informace a příklady najdete na stránce s System.Enum referenčními informacemi k rozhraní API.
Počínaje jazykem C# 7,3 můžete použít System.Enum omezení základní třídy (označované jako omezení výčtu) a určit tak, že parametr typu je výčtový typ. Jakýkoli typ výčtu také splňuje struct omezení, které slouží k určení toho, že parametr typu je typ hodnoty, která není null.
Převody
Pro jakýkoliv typ výčtu existují explicitní převody mezi výčtovým typem a jeho základním integrálním typem. Pokud přetypování hodnoty výčtu na svůj nadřízený typ, je výsledkem přidružená celočíselná hodnota člena výčtu.
public enum Season
{
Spring,
Summer,
Autumn,
Winter
}
public class EnumConversionExample
{
public static void Main()
{
Season a = Season.Autumn;
Console.WriteLine($"Integral value of {a} is {(int)a}"); // output: Integral value of Autumn is 2
var b = (Season)1;
Console.WriteLine(b); // output: Summer
var c = (Season)4;
Console.WriteLine(c); // output: 4
}
}
Použijte Enum.IsDefined metodu k určení, zda typ výčtu obsahuje člena výčtu s určitou přidruženou hodnotou.
Pro jakýkoliv typ výčtu existují převody zabalení a rozbalení do a z System.Enum typu, v uvedeném pořadí.
specifikace jazyka C#
Další informace naleznete v následujících oddílech specifikace jazyka C#:
- Výčty
- Výčtové hodnoty a operace
- Logické operátory výčtu
- Operátory porovnání výčtu
- Explicitní převody výčtu
- Implicitní převody výčtu