Aracılığıyla paylaş


C# numaralandırmaları

Tip

Yazılım geliştirme konusunda yeni misiniz? İlk olarak Başlangıç öğreticileri ile başlayın. Kodunuzda sabit bir seçenek kümesini temsil etmeniz gerektiğinde numaralandırmalarla karşılaşırsınız.

Başka bir dilde mi deneyimlisiniz? C# sabit listeleri Java veya C++ içindeki sabit listelerine benzer şekilde çalışır ve bit bayrakları ve desen eşleştirme için ek destek sunar. C#'ye özgü kalıplar için bayrakları ve switch ifadesi bölümlerini gözden geçirin.

Numaralandırma türü (veya sabit listesi), bir tamsayı değeriyle yedeklenen adlandırılmış sabitler kümesini tanımlar. Bir değerin sabit bir seçenek kümesinden (haftanın günleri, HTTP durum kodları, kayıt seviyeleri veya yönler) biri olması gerektiğinde numaralandırmaları kullanın. Enumlar, derleyicinin adlandırılmış değerleri zorunlu kılması nedeniyle, kodunuzu ham tamsayı sabitlerinden daha okunabilir ve daha az hataya açık hale getirir.

Enum bildirimi yapma

enum anahtar kelimesiyle, ardından tür adı ve üyeleriyle enum tanımlayın.

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

Varsayılan olarak, temel alınan tür int olur ve değerler 0 ile başlar, birer birer artar. Season.Spring 0, Season.Summer1 ve benzeri.

Temel alınan türü ve açık değerleri belirtin

Farklı bir tamsayı türü seçebilir ve sayısal gösterimi denetlemek için açık değerler atayabilirsiniz:

enum HttpStatus : ushort
{
    OK = 200,
    NotFound = 404,
    InternalServerError = 500
}

Sayıların HTTP durum kodları veya protokol tanımlayıcıları gibi dış anlamı olduğunda açık değerleri kullanın. Temel alınan tür, char dışında herhangi bir tamsayı türü olabilir. byte, short, ushort, int, uint, long veya ulong kullanın.

Switch ifadelerinde enum türlerini kullanma

Numaralandırmalar, switch ifadeler ve desen eşleştirme ile doğal olarak çalışır. Derleyici, tüm üyeleri işlemezseniz sizi uyarır ve bu da daha sonra yeni bir değer eklediğinizde hataları önlemeye yardımcı olur:

static string DescribeSeason(Season season) => season switch
{
    Season.Spring => "Flowers bloom and temperatures rise.",
    Season.Summer => "Long days and warm weather.",
    Season.Autumn => "Leaves change color and fall.",
    Season.Winter => "Short days and cold temperatures.",
    _ => throw new ArgumentOutOfRangeException(nameof(season))
};
var today = Season.Autumn;
Console.WriteLine(DescribeSeason(today));

Atma düzeni (_), açıkça listelenmeyen tüm değerleri işler. Desen eşleştirme , bir değeri bir şekle veya koşula göre test eden bir C# özelliğidir. Bu örnekte, her case numaralandırmanın belirli bir üyeyle eşleşip eşleşmediğini kontrol eder. Switch ifadeleri çeşitli desen eşleştirme biçimlerinden biridir. Desen eşleştirme hakkında daha fazla bilgi için bkz . Desen eşleştirme.

Bit bayrakları

Sabit liste tek bir seçenek yerine bir seçim birleşimini temsil ettiğinde, her üyeyi ikinin katı olarak tanımlayın ve ardından FlagsAttribute uygulayın.

[Flags]
enum FileAccess
{
    None = 0,
    Read = 1,
    Write = 2,
    Execute = 4,
    ReadWrite = Read | Write,
    All = Read | Write | Execute
}

| işlecini kullanarak değerleri birleştirin ve HasFlag kullanarak bireysel bayrakları test edin:

var permissions = FileAccess.Read | FileAccess.Write;

Console.WriteLine(permissions);                          // ReadWrite
Console.WriteLine(permissions.HasFlag(FileAccess.Read)); // True
Console.WriteLine(permissions.HasFlag(FileAccess.Execute)); // False

[Flags] özniteliği, ToString()'i de etkiler. Birleştirilmiş değerleri, ham sayı yerine virgülle ayrılmış isimler şeklinde (Read, Write gibi) görüntüler. Daha fazla bilgi için bkz. System.FlagsAttribute.

Enum ve tamsayılar arasında dönüştürme

Açık dönüşümler, bir enum ile temel alınan tamsayı türü arasında dönüştürülür.

var status = HttpStatus.NotFound;
ushort code = (ushort)status;
Console.WriteLine($"Status: {status} ({code})"); // Status: NotFound (404)

var fromCode = (HttpStatus)200;
Console.WriteLine(fromCode); // OK

Bir tamsayıyı bir enum'a çevirdiğinizde, değerin tanımlı bir üyeye uyup uymadığını doğrulamak için bir doğrulama yapılmaz. Dış kaynaklardan sayısal girişi kabul ettiğinizde geçerliliği denetlemek için kullanın Enum.IsDefined .

Dizeleri ayrıştırma ve değerler üzerinden döngü oluşturma

Enum Temel sınıf, dizeleri ayrıştırma ve tüm tanımlı değerler üzerinde yineleme için yöntemler sağlar:

// Parse a string to an enum value:
var parsed = Enum.Parse<Season>("Winter");
Console.WriteLine(parsed); // Winter

// Try to parse safely. It returns false only when the input can't be parsed. Call Enum.IsDefined to validate named members:
if (Enum.TryParse<Season>("Monsoon", out var unknown))
{
    Console.WriteLine(unknown);
}
else
{
    Console.WriteLine("'Monsoon' is not a valid Season"); // 'Monsoon' is not a valid Season
}

// Iterate over all values in an enum:
foreach (var season in Enum.GetValues<Season>())
{
    Console.WriteLine($"{season} = {(int)season}");
}
// Spring = 0
// Summer = 1
// Autumn = 2
// Winter = 3

Girişin Enum.TryParse<TEnum>(String, Boolean, TEnum) geçersiz olabileceği durumlarda yerine kullanınEnum.Parse<TEnum>(String). Bir istisna fırlatmak yerine false döndürür.

Ayrıca bakınız