C# 15'te Koleksiyon İfadelerine Özel Karşılaştırıcı Desteği
C# 15 önizlemesiyle gelen with(...) söz dizimi, HashSet ve List gibi koleksiyonlara özel karşılaştırıcı ve kapasite parametrelerini koleksiyon ifadesi içinde tanımlamayı sağlıyor.
C# 12 ile gelen koleksiyon ifadeleri, liste ve dizi gibi yapıları kısa ve temiz bir söz dizimiyle oluşturmayı mümkün kılmıştı. Ancak HashSet<T> gibi özel bir eşitlik karşılaştırıcısı (comparer) gerektiren koleksiyonlarda bu zarafet kayboluyor, geliştiriciler yeniden klasik constructor + initializer kalıbına dönmek zorunda kalıyordu. C# 15 önizleme sürümüyle birlikte Microsoft, koleksiyon ifadesinin ilk elemanı olarak yerleştirilebilen yeni bir with(...) söz dizimi tanıttı. Bu sayede StringComparer.OrdinalIgnoreCase gibi bir karşılaştırıcı veya List<T> için kapasite değeri, koleksiyonun içeriğiyle aynı ifade içinde, en başta belirtilebiliyor.
Bu küçük değişiklik, kodun okunabilirliğini doğrudan etkiliyor: karşılaştırıcı artık koleksiyonun anlamının bir parçası olarak, değerlerden önce göze çarpıyor. Örneğin e-posta adreslerini büyük/küçük harf duyarsız karşılaştıran özel bir IEqualityComparer<User> uygulaması, with(...) ile HashSet<User> tanımının hemen başında yer alabiliyor. Kural gereği with(...) ifadesi mutlaka ilk sırada olmak zorunda; bu da inceleme yapan geliştiricinin koleksiyonun davranışını anlamak için tüm listeyi taramasına gerek bırakmıyor.
Özellik yalnızca HashSet<T> ile sınırlı değil; List<T> için kapasite belirlemek veya SortedSet<T> için sıralama davranışını etkileyen bir karşılaştırıcı geçmek gibi senaryolarda da kullanılabiliyor. Ancak var ile hedef tip belirtilmeden kullanılamıyor, çünkü derleyicinin hangi koleksiyon türünün inşa edileceğini bilmesi gerekiyor. Bu da özelliğin bir zayıflığından çok, açıklık ve okunabilirlik lehine bilinçli bir tasarım tercihi olarak öne çıkıyor.
Önemli bir uyarı: with(...) söz dizimi şu an C# 15 önizleme sürümünün bir parçası ve .NET 11 önizleme sürümleriyle destekleniyor. Üretim kodunda kullanmadan önce proje dosyasında LangVersion değerinin preview olarak ayarlanması gerekiyor.