C# 10'da ve .NET 6'da 10 Dakika veya Daha Az Sürede Sabit Dize Enterpolasyonu
[[academy-video-youtube({"vid": "yIXqn1L7p_4", "start_time": "0", "title": "10 Dakika veya Daha Az Sürede C# 10 ve .NET 6'da Sabit İnterpolasyon", "creator": "Tim Corey", "length": "6m 14s"})]]
C# her yeni sürümle hem güç hem de zarafetle evrimleşmeye devam ediyor, geliştiricilere daha temiz ve daha verimli yollarda kod yazma olanağı sunuyor. C# 10'da tanıtılan bir diğer ekleme, sabit araya yerleştirilmiş dizelerdir — geliştiricilerin sabitler içinde dize ara yerleştirme kullanmalarına olanak tanıyan bir özelliktir.
Bu özellikten önce, eğer bir sabit dizeyi interpolasyon kullanarak oluşturmaya çalıştıysanız (örneğin, $"{companyName} Products"), derleyici bir hata verirdi. Sabit değerlere yalnızca düz string sabitleri atayabilirdiniz, bu da genellikle sabit mesajlar veya attribute string'leri oluştururken tekrarlı veya hantal koda yol açardı.
Şimdi, C# 10 ve .NET 6 ile başlayarak, iç içe dizgileri doğrudan derleme zamanında kullanarak sabitleri birleştirebilirsiniz. Bu iyileştirme, kodunuzu daha temiz hale getirmenin yanı sıra, tüm değerler program çalışmadan önce değerlendirildiği için verimli kalmasını da sağlar.
Tim Corey, "10 Dakika veya Daha Az Sürede C# 10 ve .NET 6'da Sabit Interpolasyon" adlı videosunda bunun nasıl çalıştığını daha net anlamamız için bizi adım adım bu kavramdan geçiriyor. Kendi olağan özlü ve pratik öğretim tarzıyla Tim, bu yeni özelliğin ne yaptığını, geleneksel string birleştirmeden nasıl farklılaştığını ve özellikle nerelerde faydalı olabileceğini - özellikle niteliklerde - açıklıyor.
Şimdi Tim'in açıklamasını ele alarak C#'taki sabit interpolasyonlu dizgilerin nasıl çalıştığını ve neden geliştiriciler için faydalı bir ek olduğunu görelim.
Giriş
Bu videoda Tim, tanıdık dolar işareti ($) söz dizimini kullanan interpolasyonlu dizelerin artık sabit ifadelerde nasıl kullanılabileceğini açıklıyor, bu daha önce mümkün değildi. Bu küçük değişiklik, sürekli string yapılandırmayı daha kolay, temiz ve sürdürülebilir hale getirir.
.NET 6'da Sabitleri Keşfetmek
Tim, bir .NET 6 konsol uygulamasını açar ve sadece sabit tanımlarına odaklanmak için standart kodları kaldırır.
En basit sabit dize deklarasyonu ile başlıyor:
const string companyName = "Acme";const string companyName = "Acme";Bu, bir const string'e atanmış basit bir dize sabitidir. Bu gibi sabitler derleme zamanında değerlendirilir, bu da değerlerinin sabitlenip derlenen programa gömüldüğü anlamına gelir.
Ama Tim hızla merkezi soruya geçiyor: sabit dizeleri birleştirmek ya da başka dizelerin içine doğrudan değerleri gömerek interpolasyon kullanmak istersek ne olur?
C# 9 ve öncesinde bunu yapamazdınız:
const string productName = $"{companyName} Anvils"; // Not allowed before C# 10const string productName = $"{companyName} Anvils"; // Not allowed before C# 10Bu satır, sabit ifadeler için string enterpolasyonu desteklenmediğinden derleme zamanı hatası verecektir.
C# 10'da Sabit İç İçe Geçmiş Dizeler
Tim'in gösterdiği gibi, C# 10'da derleyici artık sabit ara dizimli string'leri destekliyor — içlerindeki tüm ara dizilim ifadelerinin de sabit olması şartıyla.
Bu nedenle, aşağıdaki örnek şimdi mükemmel bir şekilde çalışıyor:
const string productName = $"{companyName} Anvils";const string productName = $"{companyName} Anvils";Bu, sabit bir enterpolasyonlu dizedir, yani derleyici enterpolasyonlu dizeyi çalışma zamanında değil, derleme zamanında değerlendirir. Program çalıştığında ek bir dize birleştirmesi veya dize biçimlendirmesi gerçekleşmez — derleyici "Acme Anvils" gibi tek bir sabit dize literalı üretir.
Tim, companyName değerini "Acme"den "ABC"ye değiştirirsek, derleyicinin productName için otomatik olarak "ABC Anvils" oluşturduğunu açıklar. Bu, derleme zamanı dizge yapısıdır, çalışma zamanı yerleştirme değil.
Bu geliştirme, sabit dizgileri + birleştirme işlemine başvurmadan veya değerleri elle tekrar etmeden birleştirmeyi çok daha kolay hale getirir.
İç İçe Sabit Enterpolasyonu
Tim, başka bir sabit tanımı ile bir adım daha ileri gider:
const string productDescription = $"{productName} are the best way to crush unsuspecting roadrunners.";const string productDescription = $"{productName} are the best way to crush unsuspecting roadrunners.";Bu, bir sabit ara değerli dizenin (productName) başka bir dizenin içinde kullanıldığı iç içe ara değerlemenin bir örneğidir.
Derleyici, bunların hepsini sabit ifadeler olarak değerlendirir ve derleme zamanında tek, değiştirilemez bir dize temsilini oluşturur.
Tim programı çalıştırdığında, çıktı:
Acme Anvils are the best way to crush unsuspecting roadrunners.Acme Anvils are the best way to crush unsuspecting roadrunners.Bu, sabit interpolasyonun sorunsuz çalıştığını, hatta birden fazla sabit arasında geçiş yaptığını doğrular.
Neden Sabitler Önemlidir
Bu noktada, Tim, sabitlerin — ve şimdi sabit ara değerli dizgilerin — neden faydalı olduklarını açıklamak için duraklar.
Sabitler, değerlerinin derlenmiş kodda doğrudan saklanması, bellekte ayrı örnekler olarak değil, hafıza açısından son derece verimli olduğuna dikkat çeker.
Öte yandan, geliştiricilerin daha önce benzer bir şeye ihtiyaç duyduklarında, genellikle salt okunur alanlar kullandıkları görülürdü:
readonly string companyName = "Acme";readonly string companyName = "Acme";Ancak Tim, salt okunur alanların const ile aynı olmadığını belirtir — bunlar çalışma zamanında değerlendirilir, bu da daha fazla bellek tüketir ve derleme zamanı optimizasyonunu engeller.
Sabit enterpolasyonlu dizeler ile artık derleme zamanı sabitlerini olarak kalan, ifade gücü yüksek ve tekrar kullanılabilir biçimlendirilmiş dizeler yazabiliriz, bu da hem açıklığı hem de performansı artırır.
Pratik Örnek — Sabitleri Niteliklerde Kullanma
Tim daha sonra bu yeni özelliğin parladığı gerçek bir senaryo olan nitelikleri tanıtır.
Main() içinde basit bir yerel yöntem tanımlar:
void SayHi() { }void SayHi() { }Daha sonra [Obsolete] özelliğini bir değişkene referans veren bir metin mesajı ile uygulamayı dener:
string myCompany = "Tim's Company";
[Obsolete($"This is no longer used for {myCompany}")]string myCompany = "Tim's Company";
[Obsolete($"This is no longer used for {myCompany}")]Bu başarısız olur çünkü öznitelikler yalnızca sabit ifadeleri parametre olarak kabul edebilir. Derleyici bir hata üretir çünkü myCompany sabit bir değer değil, bir değişkendir.
Tim, atributun mesajının derleme zamanı sabiti olması gerektiğini açıklar — bu, çalışma zamanı değerlerine veya örnek değişkenlere bağlı olamaz.
Ancak, C# 10'da sabit ara stringler sayesinde, artık bunu güvenli bir şekilde yapabiliriz:
const string productName = $"{companyName} Anvils";
[Obsolete($"This is no longer used for {productName}")]const string productName = $"{companyName} Anvils";
[Obsolete($"This is no longer used for {productName}")]Burada derleyici, hem companyName hem de productName değişmez olduğunu tanır, bu yüzden tüm ara değerli dize bir sabit ifadedir.
Derleyici, biçimlendirilmiş dizeyi derleme zamanında üretir ve bu, öznitelik içinde geçerli olmasını sağlar.
Bu örnek, sabit eklemenin sadece sözdizimsel bir tatlandırıcı olmadığını, niteliklerde veya meta verilerde biçimlendirilmiş derleme zamanı dizelerini doğrudan kullanmak gibi yeni senaryoları mümkün kıldığını mükemmel bir şekilde vurgular.
Sahne Arkasında — Derleyici Nasıl İşliyor
Tim videoda düşük seviyeli derleyici iç detaylarına girmiyor, fakat kavram C# 10'da yerleşik string işleyicilerinin nasıl çalıştığına yakından bağlı.
Genel olarak, derleyici bir ara dizgiyle karşılaştığında, sahne arkasında AppendLiteral() ve AppendFormatted() çağrılarını üreten bir format dizgisi işlemi gibi benzer bir kod oluşturur.
Ancak sabit enterpole edilmiş dizelerle uğraşırken, derleyici her şeyi derleme zamanında değerlendirir — oluşturulan IL kodunda enterpole edilmiş dize işleyicisi veya metot çağrısı yayımlanmaz.
Bu, ortaya çıkan değerin herhangi bir dize sabiti gibi davrandığı anlamına gelir, ancak yine de diğer sabitlerden gömülü ifadeler kullanarak onu oluşturabilirsiniz.
Bu, ifade gücü ve verimlilik arasında zarif bir dengedir — derleyici, dizge yapımını statik olarak ele alır ve çalışma zamanı maliyetini sıfırda tutar.
Sabit Enterpole Edilmiş Dizeleri Ne Zaman Kullanmalı
Tim, herkesin bu özelliği her gün kullanmayacağını kabul ediyor. Sabitler tanımlamayan veya öznitelik yazmayan geliştiriciler hemen fayda sağlamayabilir.
Ancak, birçok derleme zamanı tanımı, sabit mesaj veya öznitelik meta verisi oluşturanlar için bu özellik, kodu basitleştirir ve string birleştirme karmaşasını önler.
Ayrıca daha güvenlidir — sabitler değişmezdir ve derleyici tarafından kontrol edilir; bu da dinamik olarak birleştirilen dizelerden veya kötü yönetilen değişkenlerden kaynaklanan hataları ortadan kaldırır.
Bu, kodunuzu daha sağlam, okunabilir ve bakımı daha kolay hale getirir.
Sonuç
Tim videosunu tamamlarken, geliştiricileri projelerinde sabit iç içe geçmiş string kullanıp kullanmayacaklarını düşünmeye davet ediyor. Kimi bunları derleme zamanı daha temiz biçimlendirilmiş dizgeler için vazgeçilmez bulabilir, kimileri ise küçük bir kolaylık olarak görebilir.
Her iki durumda da, Tim'in gösterimi bu özelliği nasıl uygulayacağınızı ve nerede etkili bir şekilde uygulayacağınızı tam olarak gösteriyor.
Özetle:
Sabit ara diziler, sabitler içinde ara değer ifadelerine izin verir.
Derleme zamanında değerlendirilirler ve verimli dize literalleri üretirler.
Yinelemeli dize birleştirmesini daha temiz sözdizimiyle değiştirirler.
- Özellikle niteliklerde, sabit tabanlı yapılandırmada ve meta veri mesajlarında kullanışlıdırlar.
C# 10'un sabit enterpolasyonu, derleme zamanında güvenliği sağlarken okunabilirliği birleştirerek, ifade ve verimli C# programlamasına doğru bir başka adımdır — Tim Corey'nin örneğinin açıkça gösterdiği gibi.

