Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
-
isişlecin sağ tarafında. - Bir
switchifadenincaseetiketinde. - İ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ş:
-
nullsabit bir desendir.deliveryifadesininnullolarak değerlendirilip değerlendirilmediğini test eder. -
ExpressDelivery expressiki parçalı bir bildirim desenidir .ExpressDeliverytür testi bölümüdür. Değerlendirilen değerin, çalışma zamanı türü ileExpressDeliveryuyumlu olan null olmayan bir nesne olup olmadığını test eder.express, değişken gösterimidir:expressadlı bir değişken bildirir ve eşleşenExpressDeliverynesnesini 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.Daysdenetlenecek özelliği belirtir; böyleceDaysözellik ifadesi özyinelemeli desenin girdisi hâline gelir.<= 2bölümü, değerlendirilen değerin değerinden küçük veya ona eşit olup olmadığını sınayan bir2. -
_(alt çizgi), yok sayma desenidir. dahil olmak üzerenulldeğ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
switchifadesini 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.