Aracılığıyla paylaş


Numaralandırma türleri (C# başvurusu)

Numaralandırma türü (veya numaralandırma türü), temel alınan tam sayı sayısal türünün adlandırılmış sabitleri kümesi tarafından tanımlanan bir değer türüdür. Bir numaralandırma türü tanımlamak için anahtar sözcüğünü enum kullanın ve sabit listesi üyelerinin adlarını belirtin:

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

Varsayılan olarak, enum üyelerinin ilişkili sabit değer türü int'dır; bunlar sıfırla başlar ve tanım metni sırasına göre her bir adımda bir artar. Numaralandırma türünün temel alınan türü olarak diğer tüm integral sayısal türleri açıkça belirtebilirsiniz. Aşağıdaki örnekte gösterildiği gibi ilişkili sabit değerleri açıkça belirtebilirsiniz:

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

Bir sabit listesi türü tanımının içinde bir yöntem tanımlayamazsınız. Numaralandırma türüne işlevsellik eklemek için bir uzantı üyesi oluşturun.

Sabit listesi türünün E varsayılan değeri, sıfırın karşılık gelen sabit listesi üyesi olmasa bile ifadesi (E)0tarafından üretilen değerdir.

Sıfırdan örtük dönüştürmeler

C# sabit değerden 0 herhangi bir sabit listesi türüne ve sıfıra eşit değerlerden const örtük dönüştürmelere izin verir. Bir sabit listesi sıfır değerine sahip bir üye içermediğinde bu davranış beklenmeyen sonuçlara yol açabilir:

public enum GpioPort
{
    GpioA = 1,
    GpioB,
    GpioC,
    GpioD
}

public class ZeroConversionExample
{
    public static void Main()
    {
        // This compiles without warning but creates an invalid enum value
        GpioPort port1 = (GpioPort)0;
        Console.WriteLine($"port1: {port1}"); // Output: port1: 0

        // This also compiles due to implicit conversion from zero
        GpioPort port2 = GetPort(0);
        Console.WriteLine($"port2: {port2}"); // Output: port2: 0

        // Check if the enum value is valid
        bool isValid1 = Enum.IsDefined(typeof(GpioPort), port1);
        bool isValid2 = Enum.IsDefined(typeof(GpioPort), port2);
        Console.WriteLine($"port1 is valid: {isValid1}"); // Output: port1 is valid: False
        Console.WriteLine($"port2 is valid: {isValid2}"); // Output: port2 is valid: False

        // Safer approach - validate enum values
        if (Enum.IsDefined(typeof(GpioPort), 0))
        {
            GpioPort safePort = (GpioPort)0;
        }
        else
        {
            Console.WriteLine("Value 0 is not a valid GpioPort");
            // Handle the invalid case appropriately
        }
    }

    public static GpioPort GetPort(GpioPort port)
    {
        return port;
    }
}

Yukarıdaki örnekte hem hem de port1 değerlerine atanır, ancak port2 bu değere 0sahip üye GpioPort yoktur. yöntemi bunların Enum.IsDefined geçersiz sabit listesi değerleri olduğunu onaylar.

0 bit deseni tüm sabit listesi türleri de dahil olmak üzere tüm yapı türleri için varsayılan olduğundan bu örtük dönüştürme mevcut. Ancak kodunuzda hatalara neden olabilir. Bu sorunları önlemek için:

  • Sabit listelerinizde değeri 0 olan bir üyeyi neredeyse her zaman tanımlamanız gerekir.
  • Sayısal türlerden dönüştürürken numaralandırma değerlerini doğrulamak için kullanın Enum.IsDefined .
  • Örtük olarak sabit listesi türlerine dönüştürülebilecek sayısal parametreleri kullanırken dikkatli olun.

Numaralandırma türünü, birbirini dışlayan bir değer kümesinden veya seçim birleşiminden bir seçimi temsil etmek için kullanırsınız. Bir seçim bileşimini temsil etmek için bir numaralandırma türünü bit bayrakları olarak tanımlayın.

Numaralandırma türleri bit bayrakları olarak

Numaralandırma türünün seçeneklerin bir kombinasyonunu temsil etmesini istiyorsanız, her bir seçeneğin bir bit alanı olacak şekilde numaralandırma üyeleri tanımlayın. Başka bir ifadeyle, bu numaralandırma üyelerinin ilişkili değerleri ikinin kuvvetleri olmalıdır. Ardından bit düzeyinde mantıksal işleçleri | kullanabilir veya & sırasıyla seçimleri birleştirebilir veya seçim birleşimlerini kesiştirebilirsiniz. Numaralandırma türünün bit alanları bildirdiğini belirtmek için, buna Flags özniteliğini uygulayın. Aşağıdaki örnekte gösterildiği gibi, numaralandırma türünün tanımına bazı tipik birleşimler de ekleyebilirsiniz.

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

Daha fazla bilgi ve örnek için API başvuru sayfasına, System.FlagsAttribute bölümüne bakınSystem.Enum.

System.Enum türü ve numaralandırma kısıtlaması

türü System.Enum , tüm numaralandırma türlerinin soyut temel sınıfıdır. Bir numaralandırma türü ve değerleri hakkında bilgi almak için bir dizi yöntem sağlar. Daha fazla bilgi ve örnek için API başvuru sayfasına bakın System.Enum .

Tür parametresinin bir numaralandırma türü olduğunu belirtmek için temel sınıf System.Enum olarak bilinir) kullanabilirsiniz. Herhangi bir numaralandırma türü, tür parametresinin struct null atanamaz bir değer türü olduğunu belirtmek için kullanılan kısıtlamayı da karşılar.

Dönüşümler

Herhangi bir numaralandırma türü için, numaralandırma türü ile temel alınan tam sayı türü arasında açık dönüştürmeler vardır. Bir enum değerini temel alınan türüne dönüştürürseniz, sonuç bir enum üyesinin ilişkili sayısal değeridir.

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 yöntemini, bir numaralandırma türünün belirli bir ilişkili değere sahip bir enum üyesi içerip içermediğini belirlemek için kullanın.

Herhangi bir numaralandırma türü için, sırasıyla kutulama ve kutudan çıkarma dönüştürmeleri System.Enum türüne ve türünden yapılabilir.

C# dil belirtimi

Daha fazla bilgi için C# dil belirtimininaşağıdaki bölümlerine bakın:

Ayrıca bakınız