Typy wyliczeniowe (Przewodnik programowania w języku C#)
Typ wyliczenia (również nazywane wyliczeniem lub wyliczeniowego) zapewnia skuteczny sposób, aby zdefiniować zestaw nazwanego integralną stałe, które mogą być przypisane do zmiennej.Załóżmy na przykład, że trzeba zdefiniować zmienną, której wartość reprezentuje dzień tygodnia.Istnieje tylko siedem istotnych wartości, które kiedykolwiek przechowa tej zmiennej.Aby zdefiniować te wartości, można użyć typ wyliczenia, która jest zadeklarowana za pomocą enum słowa kluczowego.
enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
Domyślnym typem podstawowym każdego elementu w elemencie enum jest int.Za pomocą dwukropka, można określić innego typu liczbowego integralną, jak pokazano w poprzednim przykładzie.Aby uzyskać pełną listę możliwych typów, zobacz enum (C# — informacje).
Podstawowe wartości numerycznych można sprawdzać przy rzutowanie typu podstawowego, jak pokazano w następującym przykładzie.
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.
Zalety korzystania z wyliczenia zamiast typu liczbowego są następujące:
Jasno określa dla kodu klienta, które wartości są prawidłowe dla zmiennej.
W Visual Studio, IntelliSense wyświetla listę określonych wartości.
Jeśli nie określisz wartości elementów na liście modułu wyliczającego, wartości są automatycznie zwiększana o 1.W poprzednim przykładzie Days.Sunday ma wartość 0, Days.Monday ma wartość 1 i tak dalej.Podczas tworzenia nowego Days obiektu, to będzie mieć wartość domyślną Days.Sunday (0), jeśli nie zostanie jawnie przypisany jej wartość.Podczas tworzenia wyliczenia, wybierz najbardziej logicznym wartość domyślną i nadaj wartość zero.Który spowoduje, że same teksty stałe mieć wartość domyślna, jeśli nie są one wyraźnie przypisywane wartość podczas ich tworzenia.
Jeśli zmienna meetingDay jest typu Days, a następnie (bez jawne rzutowania) można przypisać tylko to jedną z wartości zdefiniowanych przez wyliczenie Days.I jeśli zmieni się w dniu spotkania, można przypisać nową wartość z Days do meetingDay:
Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;
[!UWAGA]
Można przypisać dowolną wartość całkowitą dowolnego do meetingDay.Na przykład, poniższy wiersz kodu nie produkuje błąd: meetingDay = (Days) 42.Jednakże nie należy robić to ponieważ ukryte oczekiwanie jest zmienną enum będzie jedną z wartości zdefiniowanych przez wyliczenie tylko przytrzymaj.Aby przypisać na dowolną wartość do zmiennej typ wyliczenia jest wprowadzenie wysokiego ryzyka w poszukiwaniu błędów.
Można przypisać wartości do elementów na liście modułu wyliczającego typ wyliczenia, i umożliwia także obliczonych wartości:
enum MachineState
{
PowerOff = 0,
Running = 5,
Sleeping = 10,
Hibernating = Sleeping + 5
}
Typy jako flag bitowych
Typ wyliczenia można użyć do zdefiniowania flag bitowych, co umożliwia wystąpienie typ wyliczeniowy został użyty do przechowywania dowolną kombinacją wartości, które są zdefiniowane na liście modułu wyliczającego.(Oczywiście, niektóre kombinacje mogą być znaczące o dozwolonych w kodzie programu.)
Tworzenie bit flagi enum stosując FlagsAttribute atrybutu i odpowiednio definiowanie wartości tak, aby AND, OR, NOT i XOR Operacje bitowe mogą być wykonywane na ich temat.W nieco flagi enum obejmują nazwany stała wartość zero, co oznacza "ustawionych żadnych flag". Nie udzielaj flagi wartość zero jeśli nie oznacza to "ustawionych żadnych flag".
W poniższym przykładzie, inna wersja Days enum, którego nazwą jest Days2, jest zdefiniowany.Days2ma Flags atrybutu i każda wartość jest przypisany dalej większą potęgą liczby 2.Pozwala to na tworzenie Days2 zmiennej, której wartość jest Days2.Tuesday i 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;
}
Aby ustawić flagę w elemencie enum, użyj bitowe OR operatora, jak pokazano w poniższym przykładzie:
// 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
Aby określić, czy ustawiono określoną flagą, użyj logiczną AND operacji, jak pokazano w poniższym przykładzie:
// 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.
Aby uzyskać więcej informacji o tym, jakie czynniki należy rozważyć, gdy zdefiniowano typy z FlagsAttribute atrybut, zobacz Enum.
Za pomocą metod element System.Enum odkryć i manipulować wartościami
Same teksty stałe są instancjami Enum typu.Nie można wyznaczyć nowych klas z Enum, ale jego metody można użyć do odnajdowania informacji o i manipulować wartościami w wystąpieniu enum.
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);
Aby uzyskać więcej informacji, zobacz [AllMembers.T:System.Enum].
Można także utworzyć nową metodę wyliczenia, przy użyciu metody rozszerzenia.Aby uzyskać więcej informacji, zobacz Porady: utworzenie nowej metody wyliczania (Przewodnik programowania w języku C#).
Rekomendowane rozdziału książki
Więcej informacji na temat zmiennych w początku Visual C# 2010