İlişkisel, mantıksal ve ayraçlı desenler

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. Desenler sizin için yeniyse desen eşleştirmeye genel bakış ile başlayın. Tam dil kuralları için bkz. dil başvurusundaki ilişkisel desenler ve mantıksal desenler .

İlişkisel ve mantıksal desenler aralıkları, alternatifleri ve dışlamaları açıklar. Aşağıdaki yöntem, bir sıcaklığı sınıflandırmak için bunları birleştirir:

static string ClassifyTemperature(int temperature) =>
    temperature switch
    {
        < 0 => "Below freezing",
        >= 18 and <= 24 => "Comfortable",
        (>= 0 and < 10) or > 30 => "Far outside the comfortable range",
        _ => "Cool or warm"
    };

İfade temperature, desen girdisidir. C# bunu bir kez değerlendirir ve her anahtar kolu sonuçta elde edilen değeri test eder. Kollar şu testleri gösterir:

  • < 0 bir sınırı test eder.
  • >= 18 and <= 24 bir diziyi test eder.
  • (>= 0 and < 10) or > 30 iki alternatif aralığı test eder.

Bu makalede, her formu öğrenebilmeniz ve aynı kararları nasıl ifade ettiklerini karşılaştırabilmeniz için hem desenler hem de kesinlik temelli koşullar gösterilmektedir. Tek bir koşul her iki biçimde de benzer görünebilir. Örüntüler, seçenekleri sonuçlarının yanında tutarak birbiriyle ilişkili dallar dizisinin daha kolay okunmasını sağlayabilir. Kodun anlaşılmasını kolaylaştıran formu seçin.

Değerleri ilişkisel desenlerle karşılaştırma

İlişkisel desen, desen girişini , , ><=veya >=kullanarak <bir derleme zamanı sabitiyle karşılaştırır. Derleme zamanı sabiti, derleyicinin programı derlerken değerlendirebileceği bir değerdir. Sayısal ve karakter değişmez değerleri ile const uyumlu sayısal veya karakter türlerinin değişkenleri, temsili örneklerdir. Normal değişkenler, özellikler, yöntem çağrıları ve static readonly alanlar derleme zamanı sabitleri değildir. İlk örnekte, hem >= 18 hem de <= 24, değerlendirilen aynı temperature değerini sınar.

Aynı ilişkisel simge normal bir ifadede veya bir desende görünebilir. Aşağıdaki örnekte her iki form da sıcaklıkla birlikte kullanılır:

static void ShowExpressionAndPattern(int temperature, int threshold)
{
    bool belowThreshold = temperature < threshold;
    bool belowFreezing = temperature is < 0;

    string description = temperature switch
    {
        < 0 => "Freezing",
        0 => "Freezing point",
        > 0 => "Above freezing"
    };

    Console.WriteLine(
        $"Below threshold: {belowThreshold}; " +
        $"below freezing: {belowFreezing}; {description}");
}

temperature < threshold ilişkisel bir ifadedir. Her iki işleneni de değerlendirir ve bir boololuşturur. Her iki işlenen de sabit olmayan bir ifade olabilir.

temperature içindetemperature is < 0, desen giriş ifadesidir. C# bunu değerlendirir ve ilişkisel desen < 0 sonuçta elde edilen değeri test eder. Switch arm’ında < 0 => "Freezing", switch öncesindeki ifade girdiyi sağlar; bu nedenle desen yalnızca < 0 içerir.

İfade, threshold öğesini temperature değişkeniyle karşılaştırabilir. İlişkisel desen işleneni derleme zamanı sabiti olmalıdır, bu nedenle karşılaştırma değeri bir değişken olduğunda ilişkisel ifadeyi kullanın. Karşılaştırma değeri sabit olduğunda, her iki form da çalışabilir.

Sağdaki işlenen sabitse, seçiminizi öncelikle okunabilirliğe göre yapın. İlişkisel ifade genellikle tek bir doğrudan karşılaştırmaya uyar. İlişkisel desen diğer desenlerle oluşur ve çeşitli aralıklar sonuçları değiştirmek için eşlendiğinde doğal olarak uyum sağlar.

Koşulları mantıksal desenlerle birleştirme

Mantıksal desenler, desen işleçleri or, not ve and ile desenleri birleştirir veya olumsuzlar:

  • Bir and deseni, iç içe geçmiş desenlerin her ikisi de eşleştiğinde eşleşir.
  • İç içe desenlerden herhangi biri eşleştiğinde, bir or desen eşleşir.
  • Bir not desen, iç içe deseni başarısız olduğunda başarılı olur.

Açılış örneği bir aralığı or ve alternatifleri açıklamak için kullanırand. Desen not , içinde status is not Status.Completeolduğu gibi bir değeri dışlayabilir. Aşağıdaki yöntemler her iki formu da gösterir, böylece söz dizimlerini öğrenebilir ve aynı testi nasıl ifade ettiklerini karşılaştırabilirsiniz:

static bool IsWeekendPattern(DayOfWeek day) =>
    day is DayOfWeek.Saturday or DayOfWeek.Sunday;

static bool IsWeekendImperative(DayOfWeek day) =>
    day == DayOfWeek.Saturday || day == DayOfWeek.Sunday;

Desen formu, or ile birleştirilmiş iki sabit desen kullanır. Kesinlik temelli form, koşullu OR işleci ||tarafından birleştirilen iki eşitlik ifadesi kullanır. Bu tek koşul için her iki form da kısa ve nettir. Çevresindeki koda en uygun formu seçin. Desenler, ilk örnekte olduğu gibi, bir switch içindeki birbiriyle ilişkili birkaç seçeneği genellikle netleştirir.

Desen işleçleri Boole ifadeleri yerine desenler oluşturur: and desen bağlaçlarına, or desen alternatiflerine ve not desen olumsuzlamalarına karşılık gelir. Boole ifadeleri , ||ve !kullanır&&. Çeşitli desen alternatiflerinin aynı sonuca sahip olduğu zamanları seçin or . Dışlanan deseni ifade etmek, kabul edilen tüm değerleri listelemekten daha açıksa not seçin.

Desenleri parantez içinde gruplandırma

Parantez içine alınan desen, iç içe desenlerin nasıl gruplandırıldığını göstermek veya değiştirmek için parantez kullanır. Bağlama, siz parantez yazmadığınızda ortaya çıkan örtük gruplandırmaya benzer şekilde, bir işlecin hangi desen işlenenlerini birlikte gruplandırdığını belirler. C# aşağıdaki bağlama sırasını belirtir:

  1. not
  2. and
  3. or

Aşağıdaki test 1 ile 3 arasında veya özel öncelik 9'a kadar olan öncelikleri kabul eder:

static bool IsAcceptedPriority(int priority) =>
    priority is (>= 1 and <= 3) or 9;

Derleyici, or öğesini and öğesinden önce gruplar. Parantezler, hedeflenen gruplandırma işlemini açıkça ve iki alternatifin görülmesini kolaylaştırır: 1 ile 3 veya 9 arasında bir aralık. Okunabilirlik için, bir desende or ile and birlikte kullanıldığında veya not bir bileşik desene uygulandığında parantez kullanın. Parantezler, not (>= 1 and <= 3) örneğinde olduğu gibi varsayılan gruplamayı da değiştirebilir.

İç içe desenler için çalışma zamanı denetim sırası belirtilmemiştir ve desen işleçleri kısa devre Boole kuralları yerine desen eşleştirme kurallarını izler. İç içe desenler yazarak sonuçları denetim sırasına göre bağımsız olur.

Ayrı bir koşul için bir when guard kullanın

Mantıksal desenler, iç içe desenler giriş değerinin kendisini tanımladığında en iyi şekilde çalışır. when guard, bir case etiketi veya switch dalı üzerindeki ek bir Boole koşuludur. Karar, desen girişinden ayrı bilgilere de bağlı olduğunda bir koruyucu kullanın.

Aşağıdaki uyarı, sıcaklığa ve ayrı isOutdoors bir değere bağlıdır:

static string GetHeatWarning(int temperature, bool isOutdoors) =>
    temperature switch
    {
        > 35 when isOutdoors => "High heat outdoors",
        > 35 => "High heat",
        _ => "No heat warning"
    };

İlişkisel desen > 35, temperature girişini açıklar. Koruyucu when isOutdoors ayrı bir değer denetler. Koşul bir yöntem çağrısına veya desen söz diziminin açıkça ifade etmediği bir Boole ifadesine ihtiyaç duyduğunda da bir koruyucu tercih edilir.

Girişin izin verilen şekil veya değerlerinin daha kolay görülmesini sağlarken, özellikle de birkaç anahtar kolunda ilişkisel ve mantıksal desenler kullanın. Daha basit bir şekilde doğrudan bir koşul belirttiğinde sıradan bir Boole ifadesi kullanın. Anahtar seçimi ayrı bir when değere veya Boole ifadesi olarak daha iyi ifade edilen bir koşula bağlı olduğunda koruma kullanın.

Ayrıca bakınız