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, bit bayrakları ve desen eşleştirme için ek destekle Java veya C++ içindeki sabit listelerine benzer şekilde çalışır. 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 haftanın günleri, HTTP durum kodları, günlük düzeyleri veya yönler gibi sabit bir seçenek kümesinden biri olması gerektiğinde enum türlerini 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, dışında herhangi bir char 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. Bir numaralandırmanın temel türü bir tamsayı olduğundan, değişken, herhangi bir adlandırılmış üyeye karşılık gelmeyen bir değeri barındırabilir. Örneğin, (Season)99 çalışma zamanında geçerlidir. Atma düzeni, anahtar ifadesinin bu beklenmeyen değerleri güvenli bir şekilde işlemesini sağlar. 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 atama ifadeleri bir sabit listesi ile temel alınan tamsayı türü arasında dönüştürülür. Açık tür dönüştürme, derleyiciye dönüştürmeyi planladığınızı bildirmek için (Type)value söz dizimini kullanı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