C# 10 ve .NET 6'da Null Parametre Kontrolleri 10 Dakikada veya Daha Az Sürede
C# ile çalışırken, geliştiricilerin yöntemlere geçirilen null argümanlarla karşılaşması yaygındır. Bu, beklenmedik davranışlara, çalışma zamanı hatalarına ve düzgün şekilde ele alınmazsa işlenmeyen istisnalara yol açabilir. Tim Corey, "Null Parameter Checks in C# 10 and .NET 6 in 10 Minutes or Less" başlıklı videosunda, C# 10'un ArgumentNullException sınıfını kullanarak null değerlerin ele alınmasını nasıl basitleştirdiğini anlatıyor.
Bu makalede, videoyu Tim'in açıkladığı şekilde inceleyerek null kontrollerinin nasıl çalıştığını ve modern C#'ta nasıl geliştirildiğini anlayacağız.
Sahne Kurulumu – Null Parametrelerin Kontrolü
Tim, C#'ta null parametre kontrollerinin nasıl ele alındığını göstermek için basit bir .NET 6 konsol uygulaması oluşturarak başlıyor. Ön kodu temizliyor ve nullable bir dize değişkeni beyan ediyor:
string? info = null;string? info = null;Bu null nesne, bir yöntem çağrısının düzgün şekilde başlatılmamış bir argüman alabileceği bir senaryoyu temsil eder. Tim daha sonra basit bir yöntem tanımlar:
void SayHi(string message)
{
Console.WriteLine($"Merhaba {message}");
}void SayHi(string message)
{
Console.WriteLine($"Merhaba {message}");
}Bilgi değişkenini yönteme iletir:
SayHi(info);SayHi(info);Program yürütüldüğünde, çıktı basitçe şu şekilde görüntülenir:
MerhabaHiçbir istisna meydana gelmez çünkü dizi birleştirme, bir null değeri kabul eder ve onu boş bir dizi gibi işler. Ancak Tim'in belirttiği gibi, çoğu gerçek dünya yönteminde bu, null bir başvurunun downstream sorunlara veya çağrı yığınında daha sonra bir NullReferenceException'a yol açacağı hatalı durumlar yaratabilir.
Sağlam kod yazmak için geliştiriciler, geçerli ve null olmayan girdi bekleyen her yöntemde argümanları doğrulamalıdır.
C# 10'dan Önce Geleneksel Null Kontrolü
Tim, C# 10 öncesinde iyi uygulamanın parametreleri manuel olarak kontrol etmek ve gerektiğinde bir ArgumentNullException atmak olduğunu açıklar. SayHi yönteminin içinde şunları ekler:
if (message is null)
throw new ArgumentNullException(nameof(message));if (message is null)
throw new ArgumentNullException(nameof(message));Bu kontrol, bir null argüman iletildiğinde, programın hemen yeni bir ArgumentNullException sınıf örneği atmasını sağlar.
Tim kodu çalıştırdığında, hata mesajı açıkça şu şekilde gösterir:
System.ArgumentNullException: Value cannot be null. (Parameter 'message')System.ArgumentNullException: Value cannot be null. (Parameter 'message')Bu ele alınmamış istisna, yöntemin geçersiz bir argüman aldığını belirtir. Bu durumda 'message' olan parametre adı çıktıda otomatik olarak gösterilir ve geliştiricinin hangi argümanın soruna neden olduğunu tam olarak belirlemesine yardımcı olur.
Tim, bu manuel kontrolün .NET Framework ve önceki .NET Core sürümlerinde mükemmel çalıştığını belirtir. Ancak, birden fazla parametre ile çalışırken uzun ve tekrar eden bir hale gelir. Doğrulama gerektiren her ek parametre, yöntem gövdesini karışık hale getirerek üç veya dört satır kod ekler.
C# 10'da Basit Yaklaşım – ArgumentNullException.ThrowIfNull()
Bu noktada Tim, modern C# 10 sözdizimini tanıtır. Her parametre için çoklu satır yazmak yerine, geliştiriciler artık tek satırlık bir null kontrolü kullanabilir:
ArgumentNullException.ThrowIfNull(message);ArgumentNullException.ThrowIfNull(message);Tim, bu tek satırlık kodun dahili olarak aynı doğrulama mantığını uyguladığını açıklar. İletilen argüman null ise, yöntem otomatik olarak bir istisna atar—tıpkı önceki gibi—ancak çok daha temiz bir sözdizimiyle.
Program tekrar çalıştığında, aşağıdaki çıktı görünür:
System.ArgumentNullException: Value cannot be null. (Parameter 'message')System.ArgumentNullException: Value cannot be null. (Parameter 'message')Davranış aynıdır, fakat şimdi sözdizimi basitleştirilmiştir. Manuel olarak bir ArgumentNullException nesnesi oluşturmak veya paramName parametresini manuel olarak belirtmek gerekmez. Çağıranın parametre adı, derleyici tarafından otomatik olarak çıkarsanır.
Tim, bu iyileştirmenin yanlış parametre adını referans alırken zamandan tasarruf sağladığını ve insan hatası riskini azalttığını vurgular.
Örnek: Çoklu Parametreler
Tim daha sonra çoklu parametrelerle uğraşırken geleneksel yöntemi yeni yöntem ile karşılaştırır.
C# 10 öncesinde, bir geliştirici şunları yazabilir:
if (name is null)
throw new ArgumentNullException(nameof(name));
if (email is null)
throw new ArgumentNullException(nameof(email));
if (password is null)
throw new ArgumentNullException(nameof(password));if (name is null)
throw new ArgumentNullException(nameof(name));
if (email is null)
throw new ArgumentNullException(nameof(email));
if (password is null)
throw new ArgumentNullException(nameof(password));C# 10 geliştirmesi ile, aynı kontroller şimdi daha özlü bir şekilde yazılabilir:
ArgumentNullException.ThrowIfNull(name);
ArgumentNullException.ThrowIfNull(email);
ArgumentNullException.ThrowIfNull(password);ArgumentNullException.ThrowIfNull(name);
ArgumentNullException.ThrowIfNull(email);
ArgumentNullException.ThrowIfNull(password);Bu geliştirme, sadece daha az satır yazmayla ilgili değil—yöntemlerinizi daha temiz, daha okunabilir ve daha kolay bakım yapılabilir hale getirir. Tim, eğer yönteminiz üç parametre bekliyorsa, artık on iki satır kod yerine sadece üç null kontrolüne ihtiyaç duyduğunuzu belirtir.
Bunun Neden Önemli Olduğu – Daha Güvenli, Daha Güçlü Kod
Tim, bir demoda diziye manuel olarak null geçmenin gerçekçi olmayabileceğini, ancak bunun gerçek dünya problemlerini temsil ettiğini belirtir. API'ler, kullanıcı girdileri, serileştirme süreçleri veya nesne iadesi işlemleri beklenmedik bir şekilde null nesnelere yol açabilir.
Bir yöntemin başında null kontrollerini ekleyerek, beklenmedik davranışı önler ve hızlı bir şekilde başarısız olunur—yani program hatanın yayıldığı çağrı yığını dolmadan çabuk bir istisna atar.
Ayrıca bu yeni sözdiziminin yöntemlerinizde tutarlı hata işleme kalıplarını sürdürmenize yardımcı olduğunu belirtir. Geçersiz girişlere ve başlatılmamış nesnelere karşı dirençli sağlam kod yazmayı teşvik eder.
ArgumentNullException Detayları
Tim, ArgumentNullException'un System ad alanının bir parçası olduğunu ve ArgumentException sınıfından türediğini vurgular. Geçerli bir argüman olarak kabul edilmeyen bir yönteme null başvuru gönderildiğinde atılır.
Genellikle şunları içerir:
Soruna neden olan parametre adı.
Açık bir hata mesajı: "Değer null olamaz."
- İstisnanın meydana geldiği çağrı yığını.
Tim'in örneği, .NET 6'nın bu davranışı sürdürürken sözdizimini nasıl geliştirdiğini gösterir.
Ayrıca geliştiricilerin bu kontrolleri null-birleşim operatörü (??) veya varsayılan değerler gibi diğer özelliklerle birleştirerek yedek mantık sağlamak için kullanabileceklerini kısaca belirtir—örneğin:
message ??= "Default message";message ??= "Default message";Bu, istenirse bir yöntem çalışacaksa varsayılan bir değer atama sağlar.
Hata İşlemede Null Kontrolünün Önemi
Tim, C#'ın artık null referans türlerini desteklese de çalışma zamanı null kontrollerinin hâlâ gerekli olduğunu geliştiricilere hatırlatır. Derleyici, özellikle veriler harici kaynaklardan veya kontrolünüzün dışındaki yöntemlerden geldiğinde her null referans sorununu yakalayamaz.
Argümanlarınızı kontrol etmenin iyi bir uygulama olduğunu ve uygun olduğunda bir ArgumentNullException atmanın, giriş geçerli olduğunda yönteminizin çalışmasını sağladığını vurgular. Bu işlem, çalışma süresi hatalarını en aza indirir, hata işlemi basitleştirir ve sessiz hataların önüne geçer.
Sonuç ve Geleceğe Bakış
Tim sonuca bağlarken, C# 11'in daha fazla iyileştirme getireceğini, ancak şimdilik .NET 6'da hata işlemi ve kod güvenliği için en iyi küçük iyileştirmelerden birinin ArgumentNullException.ThrowIfNull() olduğunu belirtir.
Geliştiricilere bu yaklaşımı kendi projelerinde denemelerini ve yöntemlerinin ne kadar temiz göründüğünü gözlemlemelerini önerir. "C# 10'daki bu değişiklik hakkındaki düşünceleriniz nelerdir?" sorusuyla bitirir.
Son Düşünceler
Tim Corey'nin videosu ArgumentNullException.ThrowIfNull() yönteminin C# 10'da basit ama güçlü bir iyileştirme olduğunu açıkça ortaya koymaktadır. Hata eğilimli manuel kodu azaltır, geçerli argümanların sağlanmasını garanti eder ve bir null argüman geçirildiğinde programlarınızın hızlı bir şekilde başarısız olmasını sağlar.
Bu yöntemi tutarlı bir şekilde kullanarak, geliştiriciler istisnaları temiz bir şekilde işleyen ve gizli null referans hatalarından kaçınan sağlam, okunabilir ve sürdürülebilir kodlar oluşturabilir.
Kısacası, yönteminiz geçerli bir parametre beklediğinde ve null argümanları önlemek istediğinizde, Tim Corey'nin örneğini takip edin ve şunu kullanın:
ArgumentNullException.ThrowIfNull(parameterName);ArgumentNullException.ThrowIfNull(parameterName);Kodunuzu null değerlerden ve çalışma zamanı hatalarından korumanın daha temiz, daha güvenli ve daha modern bir yoludur ve .NET 6 ve sonrasında geçerli kalacaktır.

