Özellik ve konumsal 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. Dil kurallarının tamamı için, dil başvurusundaki özellik desenleri ve konumsal desenler bölümlerine bkz.

Özellik ve konumsal desenler bir değerin her iki kısmını da test eder. Fark, bu parçaları nasıl tanımladıklarıdır:

  • Özellik düzeni, test etmek için özellikleri veya alanları adlandırır.
  • Konumsal desen, değerleri sıralarına göre tanımlar.

Bir ayrıştırma, sıralı bir bileşen değeri kümesini ortaya çıkarır. Bir demet zaten bir öğe sıralamasına sahiptir; bkz. demetleri ayrıştırma. Başka bir tür için yöntemDeconstruct, hangi bileşen değerlerinin kullanıma sunulduğu ve bunların sırasını tanımlar.

Adları ve konumları karşılaştırma

Aşağıdaki özellik düzeni, bir hava durumu okumasının iki adlandırılmış özelliğini santigrat derece sıcaklık değerleriyle test eder:

static bool IsHotAndHumid(WeatherReading reading) =>
    reading is { TemperatureC: > 30, HumidityPercent: > 70 };

sealed record WeatherReading(int TemperatureC, int HumidityPercent);

Aşağıdaki konumsal desen, bir sinyal değerini ve ardından boole değerini test ediyor:

static string GetCrossingInstruction(
    PedestrianSignal signal, bool crossingIsClear) =>
    (signal, crossingIsClear) switch
    {
        (PedestrianSignal.Walk, true) => "Cross now",
        (PedestrianSignal.Walk, false) => "Wait for the crossing to clear",
        _ => "Wait for the walk signal"
    };

enum PedestrianSignal
{
    Stop,
    Walk
}

Özellik deseni, girdilerini HumidityPercent ve TemperatureC adlarıyla tanımlar. Geçiş kodu, ayrı signal ve crossingIsClear değerlerinden bir demet oluşturur. Ardından demet deseni, bu değerleri sıralarına göre ayırt eder: signal ilk, crossingIsClear ikinci olarak. Konumsal desen, bu yeni oluşturulan demet yalnızca iki değere sahip olduğundan ve bu değerlerin sırası geçiş kararında açık bir anlam taşıdığından çok uygun bir seçimdir.

Üye adları testi açıklamaya yardımcı olduğunda bir özellik deseni seçin. Özellik desenleri genellikle sınıflar, yapılar ve kayıtlar için daha nettir. Sıralama, değerlere zaten açık bir anlam kazandırıyorsa konuma dayalı bir düzen seçin. Konumsal desenler, birden çok ilişkili değeri sabit bir sırayla tek bir değerde bir araya getiren demetlerle özellikle kullanışlıdır.

Özyinelemeli desenlerde iç içe girdileri izleyin

Özellik ve konumsal desenler özyinelemeli desenlerdir: Seçtikleri her özelliğe, alana veya konuma başka bir desen uygularlar. Seçilen değer, bu iç içe geçmiş desenin girdisi olur.

reading içinde IsHotAndHumidifadesi, özellik deseninin girişidir. C# eşleşmeden önce bu ifadeyi değerlendirir. Desen, sonuçta elde edilen nesneden iki değer alır:

  • İlişkisel desen > 30 değerini test ediyor TemperatureC.
  • İlişkisel desen > 70 değerini test ediyor HumidityPercent.

Dış tür testi isteğe bağlıdır ve özyinelemeli desen yan tümceleri boş olabilir. Örneğin, boş özellik deseni { } null olmayan değerlendirilen değerle eşleşir.

Özellik ve konumsal desenler yalnızca null olmayan değerlendirilen değerlerle eşleşmektedir. Giriş etki alanının bir parçası olduğunda null , önce null olmayan bir değeri denetleyen özyinelemeli bir desen seçin:

static string DescribeNullableInput(object? value)
{
    if (value is not { } nonNullValue)
    {
        return "No value";
    }

    return nonNullValue switch
    {
        DateTime => "Date",
        string => "Text",
        _ => "Another type"
    };
}

Giriş ifadesi şeklindedir value. C# bunu değerlendirir ve { } özellik deseni, elde edilen değeri nonNullValue öğesine atamadan önce null olmadığını denetler. Aşağıdaki anahtar ifadesi daha sonra birden çok olası çalışma zamanı türünü test edebilir. DateTime ve string tür desenlerinin bir adlandırması yoktur; çünkü yöntemin değerini yakalaması değil, yalnızca her türü tanımlaması gerekir.

Özyinelemeli desen tümceleri iç içe desenler içerdiğinde, seçilen her özellik, alan veya konum, ilgili iç içe desen için girdi olur.

Giriş ifadesi farklı türler üretebildiğinde ayraçların önüne bir tür testi ekleyebilirsiniz. İç içe bir özelliği test etmek için bir üye yolu da kullanabilirsiniz:

static string DescribeDate(object? value) =>
    value switch
    {
        DateTime { Date.DayOfWeek:
            DayOfWeek.Saturday or DayOfWeek.Sunday } => "Weekend date",
        DateTime => "Weekday date",
        null => "No date",
        _ => "Not a date"
    };

value giriş ifadesidir. C# önce değerini değerlendirir ve sonuçta elde edilen değerin bir DateTimeolup olmadığını test eder. Date özelliğinin değeri daha sonra DayOfWeek üye erişiminin girdisi hâline gelir. Son olarak, DayOfWeek değer iki sabiti test eden mantıksal desene giriş olur. Dış değer belirtilen türe sahip olduğunda ve üye yolu boyunca gereken her nesne null olmadığında eşleştirme başarılı olur.

Örüntüleri dallanma ifadeleriyle karşılaştırma

Önceki DescribeDate yöntem dört sonucu desen olarak ifade eder:

static string DescribeDate(object? value) =>
    value switch
    {
        DateTime { Date.DayOfWeek:
            DayOfWeek.Saturday or DayOfWeek.Sunday } => "Weekend date",
        DateTime => "Weekday date",
        null => "No date",
        _ => "Not a date"
    };

Aşağıdaki yöntem, bir dizi kesinlik temelli dallanma deyimiyle aynı sonuçları üretir:

static string DescribeDateWithBranches(object? value)
{
    if (value is DateTime date)
    {
        if (date.DayOfWeek == DayOfWeek.Saturday ||
            date.DayOfWeek == DayOfWeek.Sunday)
        {
            return "Weekend date";
        }

        return "Weekday date";
    }

    if (value is null)
    {
        return "No date";
    }

    return "Not a date";
}

Desen tabanlı sürüm, birkaç dal bir değerin türünü ve şeklini test ettiğinde olası sonuçları bir arada tutar. Kesinlik temelli sürüm her testi ve dönüş adımını açık hale getirir. Bir koşul için her iki form da benzer görünebilir. İlgili dalların sayısı arttıkça desenler alternatiflerin daha kolay karşılaştırılmasını sağlayabilir.

Ayrıca bakınız