Bildirim, sabit ve var desenleri

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. Daha önce C# desenlerini kullanmadıysanız desen eşleştirmeye genel bakış ile başlayın. Tam dil kuralları için desen başvurusuna bakın.

Bir giriş ifadesine desen uygulanır. C# ifadeyi değerlendirir, ardından desen sonuç değerini test eder veya yakalar. Bildirim, sabit ve var desenler üç pratik soruyu yanıtlar:

  • Bildirim deseni: İfade, uyumlu bir çalışma zamanı türünde null olmayan bir değer mi üretmiş? Öyleyse, bu değer için bir değişken bildirin.
  • Sabit desen: İfade belirli bir sabit değer mi üretmiş?
  • var desen: İfade hangi değeri üretti? Önce türünü veya değerini test etmeden onu yakalayın.

Bildirim deseniyle bir türü test edin ve yakalayın

Bildirim deseni bir tür ve bir atamadan oluşur. türü, test etmek için hangi çalışma zamanı türünü belirtir. Atama, eşleşen değeri alan değişkeni bildirir.

Aşağıdaki örnek bir objectalır, bu nedenle ifade birçok farklı tür üretebilir. Bildirim kalıbı, eşleşen dalda ayrı bir tür testi ve dönüştürme olmadan ondalık bir değer kullanılmasını sağlar:

static void PrintPrice(object value)
{
    if (value is decimal amount)
    {
        Console.WriteLine($"Price: {amount:C}");
    }
}

value is decimal amount'da:

  • value giriş ifadesidir. Önce C# tarafından değerlendirilir.
  • decimal test edilen türdür. Desen, değerlendirilen değer null değilse ve değerin çalışma zamanı türü decimal ile uyumluysa eşleşir.
  • amount ifadesidir. Desen eşleştiğinde, amount bildirilir ve ona ondalık değer atanır.

Derleyici, yerel değişkenin kodunuz okumadan önce bir değer alıp almadığını izler. Bu izleme, kesin atama olarak adlandırılır. if bloğunun içinde derleyici, blok yalnızca desenle eşleştiğinde çalıştığı için amount'e atama yapıldığını bilir. Kodunuz, amount bloğunun dışında if öğesine erişmeye çalışırsa derleyici hata verir. value, decimal değeri değilse amount değişkenine bir değer atanmaz.

Eşleşen dalın sonucu test edilen tür olarak kullanması gerektiğinde bir bildirim deseni seçin. Sınamayı, dönüştürmeyi ve değişken bildirimini birleştirir; böylece ifadeyi yinelemeyi veya ayrı bir tür dönüştürme yazmayı önler.

Bir ifade birkaç yararlı tür üretebileceğinden bildirim desenlerini de kullanabilirsiniz:

static string FormatSensorValue(object reading) =>
    reading switch
    {
        int count => $"Count: {count}",
        double temperature => $"Temperature: {temperature:F1}°C",
        string message => $"Message: {message}",
        _ => "Unsupported reading"
    };

Sonucun bu türün biçimlendirme davranışına ihtiyacı olduğundan her bir kol eşleşen türün değişkenini bildirir. Bildirim deseni, yalnızca değerlendirilen değer null değilse ve desenler için izin verilen dönüşümler yoluyla test edilen türle uyumlu bir çalışma zamanı türüne zaten sahipse eşleşir. null desenin eşleşebileceği bir çalışma zamanı türüne sahip değil. Desen ayrıca kullanıcı tanımlı dönüştürme işleçlerini çalıştırmaz: Bu bir tür testi ve yakalama işlemidir, değeri başka bir türe dönüştürme isteği değildir. Uyumluluk kurallarının tamamı için bkz. Bildirim ve tür desenleri.

Belirli bir değeri sabit desenle eşleştirme

Sabit desen, bir ifadenin sayı, dize, Boole, enum üyesi, bildirilen const değer veya nullgibi belirli bir sabit oluşturup oluşturmadığını sınar.

Sabit desenler, birden çok bilinen değerin her biri farklı bir sonuç ürettiğinde switch ifadesi için uygundur:

static string GetCommandMessage(Command command) =>
    command switch
    {
        Command.Start => "Starting",
        Command.Stop => "Stopping",
        Command.Pause => "Pausing",
        _ => "Unknown command"
    };

Command, adlandırılmış sabitlerden oluşan bir küme tanımlayan bir numaralandırma türüdür. Command.Start, Command.Stop ve Command.Pause, onun enum üyeleridir; bu nedenle her switch kolu, adlandırılmış komut değerini test etmek için sabit bir desen kullanır.

Komutun farklı anlamları olduğunda bu formu seçin. Anahtar kolları değerleri ve sonuçlarını bir arada tutar. Basit bir eşitlik karşılaştırması için, if gibi bir if (command == Command.Start) ifadesini okumak genellikle daha kolaydır.

Sabit desen eşleştirme, kullanıcı tanımlı == bir işleç yerine yerleşik dil eşitliği kurallarını kullanır. Ayrıntılı eşitlik ve dönüştürme kuralları için sabit desen başvurusuna bakın.

Sabit null desen, güvenilir bir null denetimi için kullanışlıdır:

static bool HasText(string? text) => text is not null;

Null durumunu denetlerken is not null veya is null seçin. Bu desenler, ifadenin türü == işleci için aşırı yükleme tanımlasa bile kullanıcı tanımlı bir eşitlik işlecini çağırmaz.

var desenine sahip bir koruma için sonuç yakalayın

Bir var desen, null dahil her sonuçla eşleşir ve türü giriş ifadesinin derleme zamanındaki türü olan bir değişken bildirir. Başka bir desen bir nesneyle zaten eşleşiyorken hesaplanan bir değeri yakalayabilir:

static string GetDeliveryMessage(object delivery) =>
    delivery switch
    {
        ExpressDelivery express
            when EstimateDays(express) is var days && days <= 2
                => $"Arrives in {days} day{(days == 1 ? "" : "s")}",
        ExpressDelivery => "Express delivery for your location takes more than two days",
        _ => "Standard delivery"
    };

static int EstimateDays(ExpressDelivery delivery) =>
    delivery.MilesAway <= 500 ? 1 :
    delivery.MilesAway <= 1_000 ? 2 : 3;

record ExpressDelivery(int MilesAway);

Bildirim kalıbı ExpressDelivery express önce teslim nesnesini express olarak yakalar. Yöntem çağrısı EstimateDays(express) , desenin var giriş ifadesidir. C# bu yöntem çağrısını değerlendirir ve ortaya çıkan sonucu, türünü veya değerini denetlemeden var days içinde days olarak yakalar. Koruma işlemi başarılı olursa tahmini süre bir veya iki gün olabilir. Arm sonucunun gerçek gün sayısını raporlamak için yakalanan değere ihtiyacı vardır.

Sıradan bir yerel değişken, anahtar-kol deseni ile when koruyucusu arasında bildirilemiyor. EstimateDays(express) öğesini sonuç içinde yeniden çağırmak, hesaplamayı tekrarlar. Kod zaten eşleşiyorsa ve hem koruma koşulu hem de sonuç hesaplanmış bir ara değere ihtiyaç duyuyorsa bu var desen biçimini seçin.

Yakalanan değere ihtiyacınız yoksa, değişken bildirmek yerine atma desenini _ kullanın.

Ayrıca bkz.