Sdílet prostřednictvím


Výčtové typy (Průvodce programováním v C#)

Typ výčtu (nazývaná také výčet nebo enum) poskytuje účinný způsob, jak definovat sadu pojmenovaných nedílnou konstanty, které může být přiřazen proměnné.Předpokládejme například, že je nutné definovat proměnné, jejichž hodnota představuje den v týdnu.Existuje pouze sedm význam hodnot, které někdy uloží dané proměnné.Chcete-li definovat tyto hodnoty, můžete použít typ výčtu, který je deklarován pomocí výčtu klíčové slovo.

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; 

Ve výchozím nastavení je základní typ každého prvku výčtového typu int.Pomocí dvojtečky, můžete určit jiné integrální číselného typu, jak je znázorněno v předchozím příkladu.Úplný seznam možných typů naleznete v tématu výčtu (C# Reference).

Základní číselné hodnoty lze ověřit přetypování na základní typ, jak ukazuje následující příklad.

Days today = Days.Monday;
int dayNumber =(int)today;
Console.WriteLine("{0} is day number #{1}.", today, dayNumber);

Months thisMonth = Months.Dec;
byte monthNumber = (byte)thisMonth;
Console.WriteLine("{0} is month number #{1}.", thisMonth, monthNumber);

// Output:
// Monday is day number #1.
// Dec is month number #11.

Výhody použití výčtu namísto číselného typu, jsou následující:

  • Jasně určit pro klientský kód hodnoty, které jsou platné pro proměnnou.

  • V Visual Studio, technologie IntelliSense zobrazí seznam definovaných hodnot.

Pokud nezadáte hodnoty pro prvky v seznamu čítače výčtu, hodnoty jsou automaticky zvětší o 1.V předchozím příkladu Days.Sunday s hodnotou 0, Days.Monday s hodnotou 1 a tak dále.Při vytváření nového Days objektu bude mít výchozí hodnotu Days.Sunday (0), pokud není výslovně ho přiřadíte hodnotu.Při vytváření výčtu zvolte nejlogičtější výchozí hodnotu a přiřaďte jí hodnotu nula.Který způsobí, že všechny výčty má tato výchozí hodnota, pokud tyto nejsou explicitně přiřazeny hodnoty při jejich vytváření.

Pokud proměnná meetingDay je typu Days, potom (bez explicitní přetypování) je možné přiřadit pouze je jedna z hodnot definovaných ve Days.A pokud se změní den schůzky, můžete přiřadit novou hodnotu z Days na meetingDay:

Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;

[!POZNÁMKA]

Je možné přiřadit jakékoli libovolné celé číslo do meetingDay.Například tento řádek kódu nevytvoří chybu: meetingDay = (Days) 42.Ale neměli byste protože implicitní očekává se, že proměnná typu enum bude obsahovat pouze jednu z hodnot, které jsou definovány výčtu.Přiřadit libovolnou hodnotu proměnné typu výčtu je vysoké riziko chyb.

Můžete přiřadit libovolné hodnoty prvků v seznamu čítače výčtu výčtového typu a můžete také použít vypočtených hodnot:

enum MachineState
{
    PowerOff = 0,
    Running = 5,
    Sleeping = 10,
    Hibernating = Sleeping + 5
}

Typy výčtu jako bitové příznaky

Můžete použít typ výčtu definovat bitové příznaky umožňující instance typu výčtu ukládat libovolné hodnoty, které jsou definovány v seznamu čítače výčtu.(Samozřejmě některé kombinace nemusí být smysluplné nebo povolených v kódu programu.)

Vytvoření poněkud výčet příznaků použitím FlagsAttribute atribut a definování hodnot vhodným způsobem tak, aby AND, OR, NOT a XOR bitové operace lze provádět s nimi.V poněkud výčet příznaků obsahovat pojmenované konstanty s hodnotou nula, která znamená "jsou nastaveny žádné příznaky." Nepřiřazujte Příznak Hodnota nula Pokud neznamená "jsou nastaveny žádné příznaky".

V následujícím příkladu, jinou verzi Days výčet, který se nazývá Days2, je definována.Days2má Flags atribut a každá hodnota je přiřazena další vyšší mocninou čísla 2.To vám umožní vytvořit Days2 proměnné, jejichž hodnota je Days2.Tuesday a Days2.Thursday.

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}
class MyClass
{
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
}

Nastavit příznak výčtu, můžete bitové OR operátor, jak je znázorněno v následujícím příkladu:

// Initialize with two flags using bitwise OR.
meetingDays = Days2.Tuesday | Days2.Thursday;

// Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days2.Friday;

Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday 

// Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday

Chcete-li zjistit, zda je konkrétní příznak nastaven, pomocí logické bitové AND operace, jak je znázorněno v následujícím příkladu:

// Test value of flags using bitwise AND. 
bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.

Další informace o tom, co je vzít v úvahu při definování výčet typů s FlagsAttribute atributu naleznete v tématu Enum.

Pomocí metody System.Enum zjišťovat a manipulace s hodnotami výčet

Všechny výčty jsou instancemi Enum typu.Nelze odvodit nové třídy z Enum, ale její metody slouží k zjištění informací o a manipulace s hodnotami v instanci výčtu.

string s = Enum.GetName(typeof(Days), 4);
Console.WriteLine(s);

Console.WriteLine("The values of the Days Enum are:");
foreach (int i in Enum.GetValues(typeof(Days)))
    Console.WriteLine(i);

Console.WriteLine("The names of the Days Enum are:");
foreach (string str in Enum.GetNames(typeof(Days)))
    Console.WriteLine(str);

Další informace naleznete v tématu [AllMembers.T:System.Enum].

Můžete také vytvořit nové metody výčtu pomocí rozšiřující metodu.Další informace naleznete v tématu Postupy: Vytvoření nové metody pro výčet (Průvodce programováním v C#).

Hlavní kapitoly knihy

Další informace o proměnných v začátek Visual C# 2010

Viz také

Referenční dokumentace

enum (Referenční dokumentace jazyka C#)

Enum

Koncepty

Průvodce programováním v C#