.NET 9 ve C# 13: Her Developer'ın Bilmesi Gereken Yeni Araçlar
Her yılın merakla beklediğimiz o günleri geldi, Microsoft yeni .Net versiyonunu yayınladı! Birlikte keşfedelim 🚀
2024’ün sonuna yaklaşırken Microsoft, beklenen yeni .NET versiyonunu nihayet yayınladı. Geçtiğimiz Mayıs ayında .NET 7’nin uzun vadeli desteği (LTS) sona ermişti. Bu ay itibarıyla yeni versiyonun çıkışıyla birlikte .NET 6’nın da LTS süreci sonlandı. Eski versiyonları kullananlar için bir nebze hüzünlü bir durum olsa da, yenilikler heyecan verici! 🥲
Microsoft’un .NET 9 ile birlikte sunduğu tüm yenilikleri tanıttığı .NET Conf 2024’ü kaçıranlar için hemen buraya bir bağlantı bırakayım. Makale boyunca paylaşacağım örnekleri denemek için henüz indirmediyseniz, .NET 9’u buradan indirebilirsiniz.
Bu makalede, tanıtılan yeniliklerin sadece bir kısmına odaklanacağım. Özellikle hem benim ilgimi çeken hem de günlük geliştirme süreçlerinizde işinize yarayacağını düşündüğüm başlıkları ele alacağım.
Ayrıca, makaledeki tüm kod örneklerini içeren ve dilediğiniz gibi fork’layıp üzerinde çalışabileceğiniz bir .NET Web API projesi de hazırladım. Projeye ulaşmak için buraya tıklayabilirsiniz.
Hazırsanız, başlayalım! 🚀
1. Hybrid Cache
Hybrid Cache, .NET 9’un getirdiği en dikkat çekici ve etkileyici yeniliklerden biri. Benim de favorilerimden biri diyebilirim! 🔥
Memory Cache ve Distributed Cache’in ayrı ayrı avantajları ve dezavantajları bulunuyor:
Memory Cache:
Hız konusunda üstün olsa da, verilerin merkezi olarak yönetilmesi gerektiğinde sorun yaşatabilir.
Ayrıca, bellekte tutulduğu için her yeni sürümle birlikte sıfırlanır.
Distributed Cache (Redis, SQL Server vb.):
Verilerin merkezi ve dayanıklı bir şekilde saklanmasını sağlarken, hız açısından Memory Cache kadar etkili değildir.
Hybrid Cache, bu iki dünyanın en iyi özelliklerini bir araya getirerek bize hız ve güvenilirliği aynı anda sunan, kendi içinde yönetilen yeni bir önbellekleme mekanizması sağlıyor.
Nasıl Çalışır?
Hybrid Cache’in temel işleyişi şu şekilde:
Primary Cache Kontrolü: Verilen key, önce Primary Cache (Memory Cache) içinde aranır.
Secondary Cache Kontrolü: Eğer Primary Cache’de bulunamazsa, Secondary Cache (Distributed Cache) kontrol edilir.
Factory Method ile Veri Yaratımı: Eğer veri Secondary Cache’de de bulunmazsa, Factory Method çağrılarak veri oluşturulur ve her iki cache’e de yazılır.
Bu nedenle Hybrid Cache’i tam anlamıyla kullanabilmek için bir Secondary Cache (örneğin: Redis, SQL Server vb..) konfigürasyonu yapılması gerekir. Ancak, eğer bir Secondary Cache yoksa, sistem yalnızca hız için optimize edilmiş Memory Cache’i kullanır.
Öne Çıkan Avantajlar
Birleşik API: Hybrid Cache, hem bellek içi hem de dağıtık cache yapıları için birleşik bir API sunar. Eğer bir Distributed Cache implementasyonu varsa, bunu otomatik olarak ikinci bir önbellek olarak kullanır.
Cache Stampede Koruması: Factory Method’a aynı anda yalnızca tek bir istemcinin erişmesine olanak tanır. Diğer istemciler bu işlemin tamamlanmasını bekler. Bu sayede, concurrency hatalarını önler.
Hybrid Cache, hız ve güvenilirlik arasındaki dengeyi kurarak, modern uygulamalar için ideal bir önbellekleme çözümü sunuyor. Performansı ve sağlam yapısıyla, daha çok konuşacağımız bir özellik olacağına eminim!
🦦 Bu özelliği denemek için hazırladığım kod örneğine buradan ulaşabilirsiniz!
2. C# 13 ile Task.WhenEach Özelliği
C# 13 ile birlikte sunulan Task.WhenEach özelliği, asenkron programlamada biz geliştiricilere yeni bir kas kazandırıyor. Elinizde gerçekleştirilmesi gereken bir dizi işlem olduğunu düşünün; bu işlemlerin her biri farklı zamanlarda tamamlanacak. İşte bu yeni özellik, her bir görevin tamamlanma sırasına göre anında işlenmesine olanak tanıyor.
.NET 8 ve Önceki Sürümler
.NET 8 ve öncesinde birden fazla görevi eşzamanlı yönetmek için Task.WhenAll veya Task.WhenAny metodları kullanılıyordu:
Task.WhenAny:
Sadece ilk tamamlanan görevin sonucunu kullanabilirsiniz. Ancak sonraki görevlerin yönetimini manuel olarak yapmak zorundasınız.
Task.WhenAll:
Tüm görevlerin tamamlanmasını bekler ve ardından devam eder. Bu nedenle daha erken tamamlanan görevlerin sonuçlarını işlemek mümkün olmaz.
Task.WhenEach ile Gelen Yenilik
Task.WhenEach, tamamlanan her görevin sonucunu, o anda işleyebilmenizi sağlar. Bu, daha erken tamamlanan görevlerden anında faydalanmanıza olanak tanır ve iş akışınızı hızlandırır.
Task.WhenEach’in Avantajları
Anında İşleme:
Erken tamamlanan görevlerin sonuçlarına hızlı bir şekilde erişim sağlar. Bu sayede gereksiz beklemelerden kaçınılarak performans artışı elde edilir.
Basitlik:
İlk tamamlanan görevden sonraki görevleri manuel olarak yönetmek zorunda kalmazsınız. await foreach yapısı sayesinde tüm görevlerin sonuçlarını, tamamlandıkça kolayca işleyebilirsiniz.
🦦 Bu özelliği denemek için hazırladığım kod örneğine buradan ulaşabilirsiniz!
3. Built-in UUID v7 (Sequential UUID) Generation
Domain-Driven Design (DDD) severleri mutlu edecek bir yenilik: UUID v7! Özellikle aggregate root’lar üzerinde primary key olarak UUID kullanımı, benzersizlik ihtiyacı olan senaryolar için iyi bir pratik olarak kabul edilir. Ancak, geleneksel UUID’ler performans açısından pek de sistem dostu değildir.
UUID v7, bu performans sorunlarını çözmek amacıyla tasarlandı ve .NET 9 ile birlikte hayatımıza girdi.
UUID v7’nin Avantajları
Zaman Tabanlı ve Sıralı:
UUID v7, zaman damgasına dayalı olarak oluşturulur ve sıralıdır. Bu özellik sayesinde veritabanında ardışık olarak saklanır ve bu da önemli bir performans artışı sağlar.
UUID Standartlarına Uygun:
Tüm UUID standartlarına uygun olduğu için geriye dönük uyumluluk sağlar.
Benzersizlik:
Hala oldukça benzersizdir ve neredeyse %100 benzersizlik garantisi sunar.
Index Yapılarıyla Dost:
Sıralı olduğu için standart UUID’lerin aksine, veritabanı indeks yapılarını bozmaz ve performansı artırır.
🦦 Bu özelliği denemek için hazırladığım kod örneğine buradan ulaşabilirsiniz!
4. Search Values
Search Values, .NET 8 ile birlikte tanıtılmış ve geleneksel ICollection.Contains yöntemine kıyasla önemli ölçüde daha verimli arama yapmak için optimize edilmiş, immutable bir değer kümesi sunmuştu. Ancak, önceki versiyonun en büyük eksikliği, yalnızca char ve byte veri türleriyle sınırlı olmasıydı.
.NET 9 ile birlikte Search Values, artık string veri setleriyle de kullanılabilir hale geldi. Özellikle büyük miktarda string operasyonu içeren senaryolarda, karşılaştırma ve arama maliyetini önemli ölçüde azaltacak kritik bir özellik olarak öne çıkıyor.
Performans Avantajı
Optimize Edilmiş Arama:
Search Values, büyük metinlerde ve çok sayıda string dizi üzerinde yapılan arama işlemlerini optimize eder.
Her string’i tek tek aramak yerine, tüm string değerlerini tek bir geçişte arayabilmenizi sağlar.
Artan Dizilerde Performans Kazancı:
Dizideki eleman sayısı arttıkça, geleneksel yöntemlere göre Search Values’un performans farkı daha belirgin hale gelir.
🦦 Bu özelliği denemek için hazırladığım kod örneğine buradan ulaşabilirsiniz!
5. Semi-Auto Properties
C#’ta bir auto property tanımladığımızda, yalnızca otomatik getter ve setter’lardan oluşan bir public property elde ederiz. Ancak, eğer bu property’nin bir takım hesaplama veya mantık içermesini istersek, genellikle manuel olarak bir backing field tanımlamak zorunda kalırız. Bu durum, kodun daha karmaşık hale gelmesine neden olabilir.
C# 13 ile gelen semi-auto properties özelliği, hem property’lerdeki basitliği koruyor hem de manuel bir backing field tanımlamadan hesaplama yapabilme imkanı sunuyor. field anahtar kelimesi sayesinde, backing field yönetimi property’nin içinde kolayca yapılabiliyor.
Öne Çıkan Avantajlar
Basitlik:
Backing field’ı elle tanımlamak yerine, doğrudan property içinde varsayılan olarak kullanabilirsiniz.
Okunabilirlik:
Gereksiz backing field tanımlamalarını ortadan kaldırarak kodun okunabilirliğini artırır ve daha temiz bir yapı sunar.
🦦 Bu özelliği denemek için hazırladığım kod örneğine buradan ulaşabilirsiniz!
6. Params Collection
C# 13 ile birlikte, daha önce de var olan params anahtar kelimesine önemli bir güncelleme geldi. Artık params, sadece dizilerle sınırlı kalmayıp, IEnumerable arayüzünü uygulayan ve Add metoduna sahip koleksiyon türlerinde de kullanılabiliyor.
Params anahtar kelimesi, bir metoda değişken sayıda argüman geçmeyi sağlar ve günlük hayatta oldukça pratik bir özelliktir. Ancak, C# 13 öncesinde sadece array tipiyle sınırlıydı. Bu durum hem kullanım alanını daraltıyor hem de performans açısından sınırlayıcı oluyordu. Çünkü array türleri belleğin heap bölgesinde tutulduğundan, IEnumerable arayüzünden türeyen koleksiyonlara kıyasla dezavantajlıydı.
Öne Çıkan Avantajlar
Esneklik:
Params artık yalnızca array veri tipiyle sınırlı değil. Daha geniş bir kullanım alanı sunarak geliştiricilere daha fazla seçenek sağlıyor.
Performans:
Span gibi belleğin stack bölgesinde saklanan veri tipleriyle kullanılabilir. Bu da daha yüksek performans anlamına gelir.
🦦 Bu yeni özelliği denemek için hazırladığım kod örneğine buradan ulaşabilirsiniz!
7. New Lock Object
.NET 9 ile birlikte C# 13’teki yenilikler arasında en dikkat çekenlerden biri, yeni Lock yapısı. System.Threading.Lock adlı bu yeni tip, geleneksel object tabanlı kilitleme yöntemlerinin yüksek eş zamanlılık gerektiren durumlarda yaşadığı performans ve güvenlik sorunlarını çözmek için geliştirildi. Ayrıca, kod tabanında diğer object türlerinden ayrışarak daha net bir yapı sunuyor.
Öne Çıkan Avantajlar
Performans: Optimize edilmiş hafif bir performans sağlar ve gereksiz CPU kullanımını önler.
Thread Güvenliği: Yüksek eş zamanlılık gerektiren senaryolarda, geleneksel object yapısına kıyasla daha güvenlidir.
Esneklik: Farklı senaryolara uygun esnek yapısıyla kolayca yapılandırılabilir.
🦦 Bu yeni yapıyı denemek için hazırladığım kod örneğine buradan ulaşabilirsiniz!
8. New LINQ Methods
AggregateBy
.NET 9 ile birlikte tanıtılan AggregateBy, koleksiyonlar üzerinde gruplama sonrası birleştirme işlemlerini daha sade ve performanslı bir şekilde yapabilmenizi sağlayan yeni bir LINQ metodudur.
Önceki .NET versiyonlarında, bir koleksiyon üzerinde gruplama işlemi yapmak için önce GroupBy, ardından Select gibi metodlar zincirlenirdi. Bu yöntem, hem kodun karmaşık hale gelmesine hem de performans kaybına neden olabiliyordu.
AggregateBy ile artık hem GroupBy hem de Sum, Count, gibi birleştirici işlemleri tek bir fonksiyonla gerçekleştirebilirsiniz. Bu, yazdığınız kodun daha temiz, daha okunabilir ve daha performanslı olmasını sağlar.
Öne Çıkan Avantajlar
Temiz Kod ve Okunabilirlik:
Daha az kod yazıldığı için kodun okunabilirliği artar ve daha sade bir yapı sunar.
Performans İyileştirmesi:
Zincirleme LINQ metodlarını azaltarak, işlemleri optimize eder ve daha hızlı bir performans sağlar.
🦦 AggregateBy özelliğini denemek için hazırladığım kod örneğine buradan ulaşabilirsiniz!
CountBy
CountBy, .NET 9 ile birlikte gelen yeni bir LINQ metodu olup, koleksiyonlar üzerinde gruplama sonrası Count() işlemini daha sade ve etkili bir şekilde yapabilmeniz için geliştirilmiştir.
.NET 8 ve öncesinde, bir koleksiyon üzerinde gruplama yapıp eleman sayısını hesaplamak için genellikle önce GroupBy, ardından Select ve Count metodları zincirlenirdi. Bu durum, hem kodun karmaşık hale gelmesine hem de performans kaybına neden olabiliyordu.
CountBy ile artık hem GroupBy hem de Count işlemini tek bir fonksiyonla gerçekleştirebilirsiniz. Bu yöntem, hem kodun okunabilirliğini artırır hem de işlem maliyetini düşürür.
Öne Çıkan Avantajlar
Kod Okunabilirliği:
GroupBy içeren LINQ sorguları genelde karmaşık ve zor anlaşılırdır. CountBy, bu karmaşıklığı azaltarak daha temiz ve okunabilir bir yapı sunar.
Performans İyileştirmesi:
Birden fazla LINQ metodunu zincirlemek yerine, tek bir metodla işlemi tamamladığı için performansı artırır.
🦦 CountBy özelliğini denemek için hazırladığım kod örneğine buradan ulaşabilirsiniz!
Index
Dizilerde index işlemleri, özellikle foreach döngülerinde her zaman maliyetli olmuştur. Geliştiriciler, döngü sırasında indekslere erişmek istediklerinde hem performans kaybı yaşar hem de ekstra kod yazmak zorunda kalır.
.NET 9, bu soruna etkili bir çözüm getirerek index işlemlerini daha kolay ve performanslı hale getirdi. Artık foreach döngüsünde hem elemanlara hem de indekslere aynı anda erişebilirsiniz. Bu, kodun hem daha temiz hem de daha hızlı olmasını sağlıyor.
Avantajlar
Performans Artışı:
Döngü sırasında indeksi manuel olarak hesaplamaya gerek kalmaz, bu da hem işlem maliyetini düşürür hem de hız kazandırır.
Kod Basitliği:
Daha az kod yazılarak indeks bilgisine erişilebilir, böylece okunabilirlik artar.
🦦 Bu özelliği denemek için hazırladığım kod örneğine buradan ulaşabilirsiniz!
9. Bye bye Swagger! Welcome Built-in OpenAPI Document Generation!
.NET 5’ten beri, .NET API dokümantasyonu ve geliştiricilere bir UI sağlamak için Swashbuckle ile güçlü bir işbirliği içerisindeydi. Ancak, topluluktan gelen geri bildirimler ve resmi açıklamalar gösteriyor ki Swashbuckle, .NET’in gelişim hızının gerisinde kaldı. Ayrıca hata düzeltme sıklığının düşük olması da eleştirilen noktalar arasında.
Bu duruma yanıt olarak, Microsoft stratejik bir adım atarak dışa bağımlılığı azaltmak ve daha hızlı bir çözüm sunmak amacıyla Microsoft.AspNetCore.OpenApi kütüphanesini geliştirdi. Artık .NET 9 proje şablonları, bu yeni kütüphane ile birlikte geliyor ve API dokümantasyonu için built-in bir çözüm sunuyor. Bu, API dokümantasyonu oluşturmayı daha kolay ve entegre bir hale getiriyor.
Nasıl Kullanılır?
Örnek uygulamayı çalıştırdıktan sonra openApi json dosyasını görüntülemek için: http://localhost:5017/openapi
JSON Formatı ve Scalar UI
OpenAPI dokümantasyonuna baktığımızda, şimdilik Swagger.json’dan çok da farklı olmayan bir JSON formatıyla karşılaşıyoruz. Bu durum, şu an için biz geliştiricilerin beklentilerini tam olarak karşılamayabilir. Özellikle cross-functional takımlar içerisinde çalışıyorsanız, Swagger gibi etkileşimli bir API UI’ı oldukça faydalı olabiliyor.
Eğer bir UI’a ihtiyaç duyuyorsanız, .NET 9 ile uyumlu çalışan Scalar’a göz atabilirsiniz. Scalar, Postman’e benzer, oldukça işlevsel bir API UI’ı sunuyor. Ayrıca, örnek repo içerisinde Scalar konfigürasyonları da mevcut. Böylece projelerinize kolayca entegre edebilirsiniz.
Scalar UI’ı Denemek İçin
Uygulamayı çalıştırdıktan sonra Scalar UI’a erişmek için:
http://localhost:5017/scalar/v1
Detaylı bilgi için: Scalar .NET API Reference Integration.
10. Diğer Yeni özellikler:
Bu makalede, .NET 9 ve C# 13’teki yeniliklerden yalnızca günlük geliştirme süreçlerimizde en çok işimize yarayacak olanlara öncelik verdim. Ancak, .NET 9’un sunduğu diğer birçok yenilik de keşfetmeye değer.
Eğer tüm özellikleri detaylıca incelemek isterseniz, aşağıdaki listeye göz atabilirsiniz 🧐
Uzun ve yorucu bir okuma oldu, biliyorum 🥲 Ancak, .NET 9 ve C# 13 ile gelen yenilikler, modern yazılım geliştirme dünyasında dönüşümün bir parçası. Bu araçları nasıl kullandığımız ve onlarla neler başardığımız, yazılım yolculuğumuzda fark yaratacak en önemli unsurlar.
Her yenilik, daha iyi çözümler üretebilmek ve işleri kolaylaştırmak için bir fırsat. İster bir adım daha hızlı olmak, ister daha iyi performans sağlamak için olsun, bu araçlar biz geliştiriciler için güçlü birer yetenek haline geliyor.
Siz de bu yenilikleri projelerinize entegre ederek, yazılım yolculuğunuzda bir adım öne çıkabilirsiniz. Ve unutmayın: En iyi kod, yalnızca çalışan kod değil, aynı zamanda yazması keyifli olan koddur 😊.
Görüşleriniz ve geri bildirimleriniz benim için çok değerli. Lütfen bana zikriye.urkmez@gmail.com üzerinden ulaşmaktan çekinmeyin!






















