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, sabit listesi üyelerinin ilişkili sabit değerleri türündedir int. Sıfırla başlar ve tanım metin sırasına göre bir artış gösterir. 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 sorunlardan kaçınmak için:

  • Neredeyse her zaman sabit listelerinizde değeri 0 olan bir üye tanımlayın.
  • 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.

Birbirini dışlayan değerler kümesinden veya seçim birleşiminden bir seçimi temsil etmek için bir numaralandırma türü kullanın. 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

Sabit listesi türünün bir seçim bileşimini temsil etmelerini istiyorsanız, tek bir seçimin bit alanı olması için bu seçenekler için numaralandırma üyeleri tanımlayın. Başka bir ifadeyle, bu sabit listesi üyelerinin ilişkili değerlerini ikinin gücü olarak kullanın. Ardından bit düzeyinde mantıksal işleçleri | kullanın veya & sırasıyla seçenekleri birleştirin veya seçim birleşimlerini kesiştirin. 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çok 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 integral 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 Bir numaralandırma türünün belirli bir ilişkili değere sahip bir sabit listesi üyesi içerip içermediğini belirlemek için yöntemini kullanın.

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

C# dil belirtimi

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

Ayrıca bakınız