Výčtové typy (C# Programming Guide)Enumeration types (C# Programming Guide)

Typ výčtu (také s názvem, výčet nebo výčet) poskytuje efektivní způsob, jak definovat sadu pojmenovaných integrálních konstant, které může být přiřazen proměnné.An enumeration type (also named an enumeration or an enum) provides an efficient way to define a set of named integral constants that may be assigned to a variable. Předpokládejme například, že máte k definování proměnné, jejíž hodnota bude představovat den v týdnu.For example, assume that you have to define a variable whose value will represent a day of the week. Existují pouze sedm smysluplné hodnoty, které někdy uloží danou proměnnou.There are only seven meaningful values which that variable will ever store. Pokud chcete definovat tyto hodnoty, můžete použít typ výčtu, která je deklarována pomocí výčtu – klíčové slovo.To define those values, you can use an enumeration type, which is declared by using the enum keyword.

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

Ve výchozím nastavení je základní typ každý prvek ve výčtovém typu int. Můžete zadat jiný integrální číselný typ pomocí dvojtečky, jak je znázorněno v předchozím příkladu.By default the underlying type of each element in the enum is int. You can specify another integral numeric type by using a colon, as shown in the previous example. Úplný seznam možných typů najdete v tématu enum (referenční dokumentace jazyka C#).For a full list of possible types, see enum (C# Reference).

Základní číselné hodnoty můžete ověřit tak přetypování na základní typ, jak ukazuje následující příklad.You can verify the underlying numeric values by casting to the underlying type, as the following example shows.

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

Month thisMonth = Month.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.

Následují výhody místo číselného typu výčtu:The following are advantages of using an enum instead of a numeric type:

  • Jasně určili klientský kód, který hodnoty jsou platné pro proměnné.You clearly specify for client code which values are valid for the variable.

  • V sadě Visual Studio IntelliSense vypíše definovanými hodnotami.In Visual Studio, IntelliSense lists the defined values.

Pokud nezadáte hodnoty pro elementy v seznam výčtu, hodnoty jsou automaticky zvýší o 1.When you do not specify values for the elements in the enumerator list, the values are automatically incremented by 1. V předchozím příkladu Day.Sunday má hodnotu 0, Day.Monday má hodnotu 1 a tak dále.In the previous example, Day.Sunday has a value of 0, Day.Monday has a value of 1, and so on. Když vytvoříte nový Day objektu, bude mít výchozí hodnotu Day.Sunday (0) Pokud není explicitně ji přiřadíte hodnotu.When you create a new Day object, it will have a default value of Day.Sunday (0) if you do not explicitly assign it a value. Při vytváření výčtu, vyberte největší smysl výchozí hodnotu a přiřaďte jí hodnotu nula.When you create an enum, select the most logical default value and give it a value of zero. Který způsobí, že všechny výčty mít tuto výchozí hodnotu, pokud jsou nejsou explicitně přiřazovat hodnota při jejich vytváření.That will cause all enums to have that default value if they are not explicitly assigned a value when they are created.

Pokud proměnná meetingDay je typu Day, pak (bez explicitního přetypování) pouze ji můžete přiřadit jednu z hodnot fronty definovaných podle Day.If the variable meetingDay is of type Day, then (without an explicit cast) you can only assign it one of the values defined by Day. A pokud se změní denní schůzku můžete přiřadit nové hodnoty z Day k meetingDay:And if the meeting day changes, you can assign a new value from Day to meetingDay:

Day meetingDay = Day.Monday;
//...
meetingDay = Day.Friday;

Poznámka

Je možné přiřadit libovolné libovolné celé číslo k meetingDay.It's possible to assign any arbitrary integer value to meetingDay. Například tento řádek kódu nevytvoří chybu: meetingDay = (Day) 42.For example, this line of code does not produce an error: meetingDay = (Day) 42. By neměl to však provést, protože implicitní očekává se, že proměnná výčtu bude obsahovat pouze jednu z hodnot fronty definovaných ve výčtu.However, you should not do this because the implicit expectation is that an enum variable will only hold one of the values defined by the enum. Přiřazení je libovolná hodnota proměnné typu výčtu je vám představit vysokým rizikem pro chyby.To assign an arbitrary value to a variable of an enumeration type is to introduce a high risk for errors.

Můžete přiřadit libovolné hodnoty prvků v seznamu výčtu výčtového typu, a můžete také použít počítané hodnoty:You can assign any values to the elements in the enumerator list of an enumeration type, and you can also use computed values:

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

Výčtové typy jako bitové příznakyEnumeration types as bit flags

Můžete použít typ výčtu pro definování bitových příznaků, umožňující instance typu výčtu pro uložení libovolnou kombinací hodnot, které jsou definovány v seznam výčtu.You can use an enumeration type to define bit flags, which enables an instance of the enumeration type to store any combination of the values that are defined in the enumerator list. (Samozřejmě některé kombinace nemusí být smysluplné nebo povolených ve svém kódu programu.)(Of course, some combinations may not be meaningful or allowed in your program code.)

Vytvořit trochu výčet příznaků s použitím System.FlagsAttribute atribut a odpovídajícím způsobem definování hodnoty tak, aby AND, OR, NOT a XOR bitové operace lze provádět s nimi.You create a bit flags enum by applying the System.FlagsAttribute attribute and defining the values appropriately so that AND, OR, NOT and XOR bitwise operations can be performed on them. V trochu příznaků výčtu zahrnují pojmenované konstanty s hodnotou nula, která znamená, že "se nastavit žádné příznaky."In a bit flags enum, include a named constant with a value of zero that means "no flags are set." Neudělujte příznak nulovou hodnotu Pokud neznamená "žádné příznaky se nastavují".Do not give a flag a value of zero if it does not mean "no flags are set".

V následujícím příkladu, jinou verzi aplikace Day výčet, který se nazývá Days, je definován.In the following example, another version of the Day enum, which is named Days, is defined. DaysFlags atribut a každá hodnota se přiřadí další větší mocninu 2.Days has the Flags attribute, and each value is assigned the next greater power of 2. To vám umožní vytvořit Days proměnnou, jejíž hodnota je Days.Tuesday | Days.Thursday.This enables you to create a Days variable whose value is Days.Tuesday | Days.Thursday.

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

Chcete-li nastavit příznak pro výčet, použijte bitový OR operátor, jak je znázorněno v následujícím příkladu:To set a flag on an enum, use the bitwise OR operator as shown in the following example:

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

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

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

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

Pokud chcete 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:To determine whether a specific flag is set, use a bitwise AND operation, as shown in the following example:

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

Další informace o tom, co vzít v úvahu při definování typů výčtu s System.FlagsAttribute atributu naleznete v tématu System.Enum.For more information about what to consider when you define enumeration types with the System.FlagsAttribute attribute, see System.Enum.

Pomocí metod System.Enum ke zjištění a manipulaci s hodnotami výčtu.Using the System.Enum methods to discover and manipulate enum values

Všechny výčty jsou instance System.Enum typu.All enums are instances of the System.Enum type. Nelze odvozovat nové třídy z System.Enum, ale můžete použít metody a projděte si informace o manipulaci s hodnotami v instanci výčtu.You cannot derive new classes from System.Enum, but you can use its methods to discover information about and manipulate values in an enum instance.

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

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

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

Další informace naleznete v tématu System.Enum.For more information, see System.Enum.

Můžete také vytvořit nové metody pro výčet pomocí metody rozšíření.You can also create a new method for an enum by using an extension method. Další informace najdete v tématu jak: Vytvoření nové metody pro výčet.For more information, see How to: Create a New Method for an Enumeration.

Viz také:See also