Typy wyliczeniowe (C# Przewodnik programowania)Enumeration types (C# Programming Guide)

Typ wyliczenia (nazywany również wyliczeniem lub wyliczeniem) zapewnia wydajny sposób definiowania zestawu nazwanych stałych, które mogą być przypisane do zmiennej.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. Załóżmy na przykład, że musisz zdefiniować zmienną, której wartość będzie zawierać dzień tygodnia.For example, assume that you have to define a variable whose value will represent a day of the week. Istnieje tylko siedem wartości, które będą kiedykolwiek przechowywane w tej zmiennej.There are only seven meaningful values which that variable will ever store. Aby zdefiniować te wartości, można użyć typu wyliczenia, który jest zadeklarowany za pomocą słowa kluczowego enum .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 }; 

Domyślnie typem podstawowym każdego elementu w wyliczeniu jest int. Możesz określić inny typ liczbowy całkowity przy użyciu dwukropka, jak pokazano w poprzednim przykładzie.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. Aby uzyskać pełną listę możliwych typów, zobacz Wyliczenie (C# odwołanie).For a full list of possible types, see enum (C# Reference).

Można sprawdzić bazowe wartości liczbowe przez rzutowanie na typ podstawowy, jak pokazano w poniższym przykładzie.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.

Poniżej przedstawiono zalety użycia wyliczenia zamiast typu liczbowego:The following are advantages of using an enum instead of a numeric type:

  • Jasno określono kod klienta, który wartości są prawidłowe dla zmiennej.You clearly specify for client code which values are valid for the variable.

  • W programie Visual Studio funkcja IntelliSense wyświetla zdefiniowane wartości.In Visual Studio, IntelliSense lists the defined values.

Jeśli nie określisz wartości dla elementów na liście moduł wyliczający, wartości są automatycznie zwiększane o 1.When you do not specify values for the elements in the enumerator list, the values are automatically incremented by 1. W poprzednim przykładzie Day.Sunday ma wartość Day.Monday 0, ma wartość 1 i tak dalej.In the previous example, Day.Sunday has a value of 0, Day.Monday has a value of 1, and so on. Podczas tworzenia nowego Day obiektu będzie on miał Day.Sunday wartość domyślną (0), jeśli nie zostanie jawnie przypisana wartość.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. Podczas tworzenia wyliczenia wybierz najbardziej logiczną wartość domyślną i nadaj jej wartość zero.When you create an enum, select the most logical default value and give it a value of zero. Spowoduje to, że wszystkie wyliczenia mają tę wartość domyślną, jeśli nie będą jawnie przypisywać wartości podczas tworzenia.That will cause all enums to have that default value if they are not explicitly assigned a value when they are created.

Jeśli zmienna meetingDay jest typu Day, a następnie (bez jawnego rzutowania) można przypisać tylko jedną z wartości zdefiniowanych przez 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. W przypadku zmiany dnia spotkania można przypisać nową wartość z Day do: meetingDayAnd if the meeting day changes, you can assign a new value from Day to meetingDay:

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

Uwaga

Można przypisać dowolną dowolną liczbę całkowitą do meetingDay.It's possible to assign any arbitrary integer value to meetingDay. Na przykład ten wiersz kodu nie powoduje błędu: meetingDay = (Day) 42.For example, this line of code does not produce an error: meetingDay = (Day) 42. Jednak nie należy tego robić, ponieważ niejawne oczekiwanie jest fakt, że zmienna enum będzie zawierać tylko jedną z wartości zdefiniowanych przez wyliczenie.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. Aby przypisać arbitralną wartość do zmiennej typu wyliczenia, należy wprowadzić wysokie ryzyko dla błędów.To assign an arbitrary value to a variable of an enumeration type is to introduce a high risk for errors.

Można przypisać dowolne wartości do elementów na liście modułów wyliczających typu wyliczenia i można również użyć wartości obliczanych: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
}

Typy wyliczeniowe jako flagi bitoweEnumeration types as bit flags

Możesz użyć typu wyliczenia, aby zdefiniować flagi bitowe, które umożliwiają wystąpienie typu wyliczenia do przechowywania dowolnej kombinacji wartości, które są zdefiniowane na liście modułów wyliczających.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. (Oczywiście Niektóre kombinacje mogą nie być znaczące ani niedozwolone w kodzie programu).(Of course, some combinations may not be meaningful or allowed in your program code.)

System.FlagsAttribute OR AbyutworzyćNOT Wyliczenie flag bitowych ,XORnależy zastosować atrybut i odpowiednio zdefiniować wartości, aby można było wykonywać na nich operacje bitowe. ANDYou 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. W wyliczeniu flag bitowych należy uwzględnić nazwaną stałą o wartości zero, co oznacza, że flagi nie są ustawione.In a bit flags enum, include a named constant with a value of zero that means "no flags are set." Nie należy dawać flagi wartością zero, jeśli nie ma znaczenia "nie ustawiono flag".Do not give a flag a value of zero if it does not mean "no flags are set".

W poniższym przykładzie jest definiowana inna wersja Day wyliczenia o nazwie. DaysIn the following example, another version of the Day enum, which is named Days, is defined. Days``Flags ma atrybut, a każda wartość jest przypisana kolejną większą potęgą 2.Days has the Flags attribute, and each value is assigned the next greater power of 2. Dzięki temu można utworzyć zmienną, Days której wartość to. Days.Tuesday | Days.ThursdayThis enables you to create a Days variable whose value is Days.Tuesday | Days.Thursday.

[Flags]
enum Days
{
    None      = 0b_0000_0000, // 0
    Sunday    = 0b_0000_0001, // 1
    Monday    = 0b_0000_0010, // 2
    Tuesday   = 0b_0000_0100, // 4
    Wednesday = 0b_0000_1000, // 8
    Thursday  = 0b_0001_0000, // 16
    Friday    = 0b_0010_0000, // 32
    Saturday  = 0b_0100_0000  // 64 
}
class MyClass
{
    Days meetingDays = Days.Tuesday | Days.Thursday;
}

Aby ustawić flagę w wyliczeniu, użyj operatora OR bitowego, jak pokazano w następującym przykładzie: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 {meetingDays}");
// Output: Meeting days are Tuesday, Thursday, Friday

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

Aby określić, czy określona flaga jest ustawiona, użyj operacji bitowej AND , jak pokazano w następującym przykładzie: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 {test == true ? "is" : "is not"} a meeting day.");
// Output: Thursday is a meeting day.

Aby uzyskać więcej informacji o tym System.FlagsAttribute , co należy wziąć pod uwagę podczas definiowania typów wyliczeniowych przy użyciu atrybutu, zobacz. System.EnumFor more information about what to consider when you define enumeration types with the System.FlagsAttribute attribute, see System.Enum.

Używanie metod system. Enum do odnajdywania i manipulowania wartościami wyliczanymiUsing the System.Enum methods to discover and manipulate enum values

Wszystkie wyliczenia są wystąpieniami System.Enum typu.All enums are instances of the System.Enum type. Nie można utworzyć nowych klas z System.Enum, ale można użyć jej metod w celu odnalezienia informacji o wartościach i manipulowania nimi w wystąpieniu wyliczenia.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);
// Output: Thursday

Console.WriteLine("The values of the Day Enum are:");
foreach (int i in Enum.GetValues(typeof(Day)))
    Console.WriteLine(i);
// Output:
// The values of the Day Enum are:
// 0
// 1
// 2
// 3
// 4
// 5
// 6

Console.WriteLine("The names of the Day Enum are:");
foreach (string str in Enum.GetNames(typeof(Day)))
    Console.WriteLine(str);
// Output:
// The names of the Day Enum are:
// Sunday
// Monday
// Tuesday
// Wednesday
// Thursday
// Friday
// Saturday

Aby uzyskać więcej informacji, zobacz System.Enum.For more information, see System.Enum.

Możesz również utworzyć nową metodę dla wyliczenia przy użyciu metody rozszerzenia.You can also create a new method for an enum by using an extension method. Aby uzyskać więcej informacji, zobacz jak: Utwórz nową metodę dla wyliczenia.For more information, see How to: Create a New Method for an Enumeration.

Zobacz takżeSee also