Desen eşleştirmeye genel bakış

Tip

Bu makale, en az bir programlama dili bilen ve C# dilini öğrenen geliştiriciler için Temel Bilgiler bölümünün bir parçasıdır. Programlamaya yeni başladıysanız ilk olarak Başlangıç öğreticileri ile başlayın. Deneyimli C# geliştiricileri, tam söz dizimi ve kuralları için desen başvurularını kullanabilir.

Başka bir dilden mi geliyorsunuz? C# desenleri, Java desen eşleştirme ve Python match örneklerine benzer bir rol sunar. C#, switch ifadelerinde, is deyimlerinde ve switch ifadelerinde desenleri kullanır.

Desen eşleştirme , bir ifadeye desen uygular. Desen, giriş ifadesini test etmek için kullanılan bir koşuldur. Desen girişi bu ifadedir. C# giriş ifadesini değerlendirir; sonuç, değerlendirilen değerdir. Desen, bu değerin belirli bir türe sahip olup olmadığını, belirli bir değere eşit olup olmadığını veya belirli bir şekle sahip olup olmadığını test eder. Bir desen eşleştiğinde, kodunuz daha belirli bir tür veya bir nesneden ayıklanan değer gibi test tarafından öğrenilen bilgileri kullanabilir.

Deseni üç bağlamda kullanabilirsiniz:

  • is işlecin sağ tarafında.
  • Bir switch ifadenin case etiketinde.
  • İfadenin bir kolunda switch .

Desenler genellikle karşılaştırma deyimleri dizisinden daha nettir çünkü her dal işlediği verileri açıklar. Örneğin, aşağıdaki yöntem bir switch teslim iletisi seçmek için bir ifade kullanır:

static string GetDeliveryMessage(Delivery? delivery) =>
    delivery switch
    {
        null => "No delivery was scheduled.",
        ExpressDelivery express => $"Express package {express.TrackingCode}",
        StandardDelivery { Days: <= 2 } => "Standard delivery arriving soon",
        _ => "Standard delivery"
    };

Özyinelemeli desenlerin kendi giriş ifadeleri vardır. StandardDelivery { Days: <= 2 } içinde, dış desen delivery ifadesini alır. Özyinelemeli <= 2 örüntüsü, StandardDelivery özellik ifadesini eşleşen Days nesnesinden alır.

Önceki ifade switch giriş ifadesidir. Küme ayraçlarının içindeki her bir çizgi, bir anahtar koludur. Desen önce =>görünür ve sonuç ondan sonra görünür. C# giriş ifadesini değerlendirir, ardından deseni eşleşen ve isteğe bağlı when koruyucusu trueolan ilk kolu metin sırasına göre seçer. İsteğe bağlı when koruma, desenden sonra yazılan ek bir Boole koşuludur. Yukarıdaki örnek aşağıdaki desenleri göstermiş:

  • null sabit bir desendir. delivery ifadesinin null olarak değerlendirilip değerlendirilmediğini test eder.
  • ExpressDelivery express iki parçalı bir bildirim desenidir . ExpressDelivery tür testi bölümüdür. Değerlendirilen değerin, çalışma zamanı türü ile ExpressDeliveryuyumlu olan null olmayan bir nesne olup olmadığını test eder. express, değişken gösterimidir: express adlı bir değişken bildirir ve eşleşen ExpressDelivery nesnesini bu değişkene atar.
  • StandardDelivery { Days: <= 2 } bir tip testi ile başlar. StandardDelivery , değerlendirilen değerin bu türdeki null olmayan bir nesne olup olmadığını test ediyor. Ayraçlar bir özellik deseni içerir. Days denetlenecek özelliği belirtir; böylece Days özellik ifadesi özyinelemeli desenin girdisi hâline gelir. <= 2 bölümü, değerlendirilen değerin değerinden küçük veya ona eşit olup olmadığını sınayan bir 2.
  • _ (alt çizgi), yok sayma desenidir. dahil olmak üzere nulldeğerlendirilen her değerle eşleşir. nullÖnceki kollar zaten ekspres teslimatları ve iki gün içinde ulaşan standart teslimatları işlediğinden, bu son kol geri kalan tüm değerleri işler.

Koruyucusu olmayan bir when kol korumasızdır. İlk örnekteki tüm kollar korumasızdır. Daha önceki korumasız bir kol, sonraki bir kolun eşleşebileceği değerlendirilen tüm değerlerle eşleşiyorsa, sonraki kol kapsanmış sayılır. Kapsanmış desen, eşleşebilecek her olası giriş değerinin önceki bir switch dalıyla zaten eşleştiği desendir. Hiçbir zaman eşleşemez, bu nedenle derleyici bir hata bildirir. Her giriş ifadesiyle eşleştiğinden atma kolu (_) en son gelmelidir. Korumalı bir kol, yalnızca desenine dayanarak sonraki bir kolu kapsamaz; çünkü koruma koşulu false olabilir.

Switch ifadesi, kolları her olası giriş ifadesini işlediğinde çok kapsamlıdır . İlk örnek eksiksizdir çünkü son eleme kolu, önceki kolların eşleştirmediği her şeyi ele alır. Derleyici, hiçbir dalın işlemediği olası bir girdi değeri tespit ettiğinde uyarı verir. Derleyici, desenlerin her bileşimi için kapsamlı olduğunu kanıtlayamaz, ancak bu tanılama doğru desen eşleştirme kodu yazmanıza yardımcı olur. Ayrıntılı eşleştirme, alt verme ve kapsamlılık kuralları için desen başvurusuna bakın.

is ile bir koşulu test edin

is Bir Boole testi gerektiğinde işlecini kullanın. Aşağıdaki kod ifadeyi delivery değerlendirir ve bildirim desenini ExpressDelivery expressuygular. Tür bölümü, değerlendirilen değer null değilse ve çalışma zamanı türü ExpressDelivery ile uyumluysa eşleşir. Desen eşleştiğinde değişken gösterimi şunu bildirir express:

static void PrintTrackingCode(Delivery delivery)
{
    if (delivery is ExpressDelivery express)
    {
        Console.WriteLine($"Track express package {express.TrackingCode}");
    }
}

Derleyici, kodunuz okumadan önce yerel bir değişkenin atanıp atanmadığını izler. Bu takip, belirli atama olarak adlandırılır. if bloğunun içinde, koşul express yalnızca desen eşleşen nesneyi true öğesine atadığında doğru olur. Bu nedenle derleyici, express öğesinin orada kesin olarak atanmış olduğunu bilir. Kodunuz özelliğini güvenle kullanabilir TrackingCode . Ayrı bir cihaz kullanmanıza gerek yok. Yalnızca tür testine ihtiyacınız varsa ve değişken bildirmeniz gerekmiyorsa, gibi delivery is ExpressDeliverybir tür deseni kullanın.

Null denetimleri için is not null veya is null kullanın. Bu desenler kullanıcı tanımlı == veya != işleci çağırmaz.

static void PrintPackageStatus(Delivery? delivery)
{
    if (delivery is null)
    {
        Console.WriteLine("No package is available.");
    }
    else
    {
        Console.WriteLine("A package is ready to track.");
    }
}

Null güvenliğiyle ilgili daha fazla bilgi için null atanabilir başvuru türleri bölümüne bakın.

Deyim ile ifade arasında seçim yapma

Modeller, switch öğesinin her iki biçimiyle de çalışır:

  • Her eşleşmenin bir veya daha fazla deyim çalıştırması gerektiğinde switchdeyimini kullanın.
  • Her eşleşmenin bir değer üretmesi gerektiğinde switch ifadesini kullanın.

Aşağıdaki switch deyimi bir teslimat güncelleştirmesi bildirir. Hızlı teslimat dalı iki mesaj yazar, bu nedenle bir ifade doğal olarak yer alır:

static void PrintDeliveryUpdate(Delivery? delivery)
{
    switch (delivery)
    {
        case null:
            Console.WriteLine("No delivery was scheduled.");
            break;
        case ExpressDelivery express:
            Console.WriteLine($"Express delivery {express.TrackingCode} is ready.");
            Console.WriteLine("Notify the priority desk.");
            break;
        case StandardDelivery standard:
            Console.WriteLine($"Standard delivery arrives in {standard.Days} days.");
            break;
        default:
            Console.WriteLine("Another delivery type is scheduled.");
            break;
    }
}

Her case, delivery ifadesine bir desen uygular. Eşleşen bölüm, break switch ifadesinden çıkmadan önce istenen sayıda deyim çalıştırabilir. default bölümü, önceki durumların eşleşmediği her şeyi ele alır.

Aşağıdaki switch ifadesi, bir sonuç atayan bir if / else if zincirin yerini alır:

static string GetStatusMessage(StandardDelivery delivery) =>
    delivery.Days switch
    {
        0 => "Delivered today",
        1 => "Arriving tomorrow",
        <= 3 => "Arriving soon",
        _ => "In transit"
    };

Switch ifadesi kısadır çünkü her kolun amacı aynıdır: döndürülecek değeri üretmek. Dallar eylemleri gerçekleştirirken switch deyimi kullanın ve dallar bir sonuç hesapladığında bir anahtar ifadesi kullanın.

Desen kategorileri

C# yaygın veri testi türleri için desenler içerir:

Desen kategorisi Neleri test eder?
Bildirim, sabit ve var desenler Çalışma zamanı türü, belirli bir sabit değer veya yakalamak istediğiniz herhangi bir değer
Tür desenleri Değişken bildirmeden çalışma zamanı türü
Özellik ve konumsal desenler Özellikler, alanlar veya ayrıştırılmış değerler
İlişkisel ve mantıksal desenler or, and ve not gibi karşılaştırmalar ve birleşimler
Liste şablonları Liste veya dizinin değerleri ve şekli
Desenleri ve atılanları at Kalan herhangi bir değer veya kodunuzun bilerek yok saydığı bir değer

Tabloda bağlantılı temel bilgiler makaleleri, şu anda bu bölümde belgelenen kategorilerin odaklanmış kapsamını sağlar. Tüm desen kategorileri için tam söz dizimi ve örnekler için desen başvurusuna bakın.

Ayrıca bkz.