Typy wyliczenia (odwołanie w C#)

Typ wyliczenia (lub typ wyliczenia) to typ wartości zdefiniowany przez zestaw nazwanych stałych bazowego typu liczbowego całkowitego. Aby zdefiniować typ wyliczenia, użyj enum słowa kluczowego i określ nazwy elementów członkowskich wyliczenia:

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

Domyślnie skojarzone wartości stałe składowych wyliczenia są typu int; zaczynają się od zera i zwiększają się o jedną po kolejności tekstu definicji. Można jawnie określić dowolny inny typ liczb całkowity jako podstawowy typ wyliczenia. Możesz również jawnie określić skojarzone wartości stałe, jak pokazano w poniższym przykładzie:

enum ErrorCode : ushort
{
    None = 0,
    Unknown = 1,
    ConnectionLost = 100,
    OutlierReading = 200
}

Nie można zdefiniować metody wewnątrz definicji typu wyliczenia. Aby dodać funkcjonalność do typu wyliczenia, utwórz metodę rozszerzenia.

Wartość domyślna typu E wyliczenia to wartość wygenerowana przez wyrażenie (E)0, nawet jeśli zero nie ma odpowiedniego elementu członkowskiego wyliczenia.

Typ wyliczenia służy do reprezentowania wyboru z zestawu wzajemnie wykluczających się wartości lub kombinacji wyborów. Aby reprezentować kombinację opcji, zdefiniuj typ wyliczenia jako flagi bitowe.

Typy wyliczenia jako flagi bitowe

Jeśli chcesz, aby typ wyliczenia reprezentował kombinację opcji, zdefiniuj elementy członkowskie wyliczenia dla tych opcji, tak aby wybór indywidualny był polem bitowym. Oznacza to, że skojarzone wartości tych elementów wyliczenia powinny być uprawnieniami dwóch. Następnie można użyć operatorów | logicznych bitowych lub & połączyć opcje lub przeciąć kombinacje wyborów, odpowiednio. Aby wskazać, że typ wyliczenia deklaruje pola bitowe, zastosuj do niego atrybut Flags . Jak pokazano w poniższym przykładzie, można również uwzględnić niektóre typowe kombinacje w definicji typu wyliczenia.

[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
    }
}

Aby uzyskać więcej informacji i przykładów, zobacz System.FlagsAttribute stronę referencyjną interfejsu API oraz sekcję Atrybuty Flags na stronie dokumentacji interfejsu System.Enum API.

Typ System.Enum i ograniczenie wyliczenia

Typ System.Enum jest abstrakcyjną klasą bazową wszystkich typów wyliczenia. Udostępnia on szereg metod uzyskiwania informacji o typie wyliczenia i jego wartościach. Aby uzyskać więcej informacji i przykładów, zobacz stronę referencyjną interfejsu System.Enum API.

Możesz użyć System.Enum w ograniczeniu klasy bazowej (nazywanej ograniczeniem wyliczenia), aby określić, że parametr typu jest typem wyliczenia. Każdy typ wyliczenia spełnia struct również ograniczenie, które służy do określania, że parametr typu jest typem wartości innej niż null.

Konwersje

W przypadku dowolnego typu wyliczenia istnieją jawne konwersje między typem wyliczenia a jego podstawowym typem całkowitym. W przypadku rzutowania wartości wyliczenia na jej typ bazowy wynik jest skojarzona wartość całkowita elementu członkowskiego wyliczenia.

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
    }
}

Enum.IsDefined Użyj metody , aby określić, czy typ wyliczenia zawiera składową wyliczenia z określoną skojarzona wartością.

W przypadku dowolnego typu wyliczenia istnieją konwersje boksu i rozpatryania do i z System.Enum typu, odpowiednio.

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz następujące sekcje specyfikacji języka C#:

Zobacz też