Teknik adı: Null-Conditional & Null-Coalescing Expression
Kategori: C# Null Safety Operators
Açıklama: Bu ifade, C# dilinde ?.
(null-conditional) ve ??
(null-coalescing) operatörlerinin birleşimiyle oluşturulan,
null güvenli (null-safe) bir geri dönüş yapısıdır.
Amaç, bir nesne null olduğunda NullReferenceException fırlatmadan alternatif bir değeri güvenli biçimde döndürmektir.
ASP.NET Core uygulamalarında hata yakalama veya loglama sırasında sıkça karşımıza çıkan şu satır, bu yapının en bilinen örneklerinden biridir:
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
Bu satır, hem modern C# null güvenliği özelliklerini hem de ASP.NET Core’un istek izleme (trace) mekanizmasını tek satırda birleştirir. Şimdi adım adım ne yaptığını inceleyelim ??
Activity.Current
, System.Diagnostics isim alanındaki bir sınıftır ve genellikle distributed tracing (dağıtık izleme) sırasında kullanılır.
Her işlem veya istek için bir “Activity” başlatılır. Bu activity'nin bir Id
değeri vardır.
Buradaki ?.
operatörü ise null-conditional operator’dür.
Yani şu anlama gelir:
if (Activity.Current != null)
temp = Activity.Current.Id;
else
temp = null;
Yani Activity.Current
yoksa (null’sa), hata fırlatmadan null
döner.
HttpContext.TraceIdentifier
ASP.NET Core tarafından her HTTP isteği için otomatik üretilen benzersiz bir tanımlayıcı (unique ID)’dir.
Bu ID, loglarda veya hata sayfalarında isteği tanımak için kullanılır:
RequestId = 0HLR87VQ23K8H:00000001
Böylece kullanıcı hata sayfasında “Request ID: 0HLR87VQ23K8H:00000001” gördüğünde, sen loglarda aynı isteği kolayca bulabilirsin.
??
null-coalescing operator olarak bilinir.
Anlamı: “Sol taraf null ise sağdakini kullan.”
Yani:
if (Activity.Current?.Id != null)
RequestId = Activity.Current.Id;
else
RequestId = HttpContext.TraceIdentifier;
ile birebir aynı şeydir.
Artık tüm satırı kolayca yorumlayabiliriz ??
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
Bu satır şu anlama gelir:
“Eğer tracing sistemi aktifse (
Activity.Current
varsa), o ID’yi kullan. Yoksa bu HTTP isteğine özel üretilenHttpContext.TraceIdentifier
’ı kullan.”
Performans açısından fark neredeyse sıfırdır. Derleyici (Roslyn) her iki yazımı da aynı IL (Intermediate Language) koduna dönüştürür:
?.
operatörü › Basit null kontrolü yapar.??
operatörü › Null ise sağdaki değeri atar.Yani bu satır:
RequestId = (Activity.Current?.Id) ?? HttpContext.TraceIdentifier;
hem en kısa, hem en güvenli, hem de en hızlı versiyondur ?
Yöntem | Avantaj |
---|---|
?. ?? kombinasyonu | Kısa, modern, null-safe, okunabilir ? |
if / ?: | Daha uzun, hata riski daha yüksek ?? |
?.
› Null-conditional: Null değilse devam et.??
› Null-coalescing: Null ise alternatif değeri kullan.HttpContext.TraceIdentifier
› Her HTTP isteği için otomatik benzersiz ID.Dolayısıyla bu satır:
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
hem performans hem de güvenlik açısından en doğru seçimdir.
Yazan: Sinan Çalışkan — Entegre Pro Yazılım & C# Notları
Kategori: ASP.NET Core, Null Safety, C# 6.0+