C# Nullable Value Types (null Değeri Alabilen Veri Tipleri )

Merhaba arkadaşlar,

Bir önceki yazımda belkide C# Generic mimarisine giriş yaptıktan sonra ( yazıya buradan ulaşabilirsiniz ) C#’taki Generic mimari hakkında bilgi edindik ve avantajları ele almıştık. Bu mimariye verilebilecek örneklerden biri de bu yazımda bahsedeceğim Nullable<T> yapılar.

Bu yazıda bahsedilecek konular

  • Nullable<T> yapılar
  • C# Sözdizimi Entegrasyonu
  • ?? operatörü
  • Null Condition Operatörü (?)

Projelerimizde hepimiz “null” değeri ile karşılaşmışızdır. Bir nesne ile işlem yaptığımızda kimi zaman null değerini set ediyoruz, kimi zaman veri tabanı tasarımı yaparken bazı kolonların null olması gerektiğini düşünüyoruz kimi zaman hatalarda null değerini görüyoruz. null değeri benim karşıma her zaman çıktı ve ilerde hep karşıma çıkacağını düşünüyorum 🙂 bundan kaçış yok gibi ( who knows 😉 ) Projelerimizi geliştirirken özellikle veri tabanı tasarımı yaparken null değerlere çokça karşımıza çıkıyor. İşte null değeri alabilecek yapıları C# Nullable<T> yapısı ile yönetebiliyoruz.

Nedir bu Nullable<T> yapılar?

Nullable<T> C# 2.0 ile birlikte dilin yapısına girmiş olan bu yapı değer tiplerine null değerini alabilme özelliğini katmayı hedeflemiş bir sarmalayıcı (wrapper) yapıdır. Yani o zaman benim aklıma var olan bir değer türünü (int, decimal…) gibi null değeri ile sarıyor ona null değerini alabilme özelliğini ekliyor. (It makes sense 🙂 ).

Yapısını baktığımızda struct (yapı – türü) yapıda olduğunu görüyoruz. Struct neydi? Sınıf gidi tanımlanan value type’dir. Biliyoruz ki C# dilinde iki veri yapısı vardır. Value type lar stack bölgesinde saklanırken ve refeans type’lar heap bölgesinde saklanıyordu. Stack bölgesinde olan value type lar işi bittiğinden stack bölgesinden kovuluyordu ama heap bölgesinde kovulma gibi bir durum söz konusu değil. Garbage collector dediğimiz çöp toplayıcı yapı heap bölgesindeki referance type ları siler ver boşalan alanı heap bölgesine geri iade eder. Şimdi konumuza geri dönebiliriz. Biraz konudan uzaklaştık gibi ama fazla bilgi göz çıkarmaz 🙂 stack ve heap bölgelerini bu vesile ile tekrar hatırlamış olduk.

Struct yapıda olması mantıklı o zaman çünkü referance type lar zaten null değerini alabiliyordu.

Nullable<T> yapısını kullanarak ne gibi avantajlar elde ediyoruz onlara bakalım.

Bir kaynaktan int türünde değerler okuduğumuzu düşünelim ve bir şekilde bu sayılar içerisine null değeri ilişmiş. Aşağıdaki kod NullReferenceException istisnai durumu fırlatacaktır.

Şimdi Nullable<T> yapısını kullanarak daha güvenli bir şekilde okuma yapmaya çalışalım.

Yukarıdaki örnekte kaynaktan okuduğumuz veriyi Nullable<T> tipine dönüştürdük. Bu sayede null değeri geldiğinde değişken için bilinçli bir dönüşüm yapmış olduk. HashValue özelliği ile değişkende bir değerin olup olmadığını kontrol ediyoruz, GetValueOrDefault() metodu ile aslında değer null ise ilgili veri tipinin varsayılan değerini ekrana yazdırıyoruz ve Value özelliği ile ilgili değişkenin değerini döndürüyoruz. Bu örnekte Value özelliğini yorum satırına aldık çünkü bu kullanımda istisnai (exception) bir durum oluşturacaktı.

Hatırlamalık: Value tipli değişken Generic mimarisinin getirdiği özellik sayesinde şablon tip türünden bir değişken özelliği kazandı.

C# sözdizimi entegrasyonu

Nullable<T> yapısının daha kullanışlı olabilmesi adına dile entegre edilmiştir. ? takısı ile kullanılabililr. Compiler (derleyici) ? ifadesini gördüğü yerde Nullable yapısına dönüştürmektedir.

null veri tipleri normal veri tiplerine dönüştürebiliriz. Bunu yaparken bilinçli tür dönüşümü (explicit) yapmak zorundayız.

Yukarıda yaptığımız dönüşümün handikabı ise null değeri içeriyorsa çalışma zamanında hata alacaktır

Önemli Not: decimal ile decimal? tamamen farklı veri tipleridir

Bu dönüşümlerin tam terside yapılabilir. Bu işlem için bilinçli tür dönüşümü kullanmaya gerek yoktur. Bilinçsiz tür dönüşümü (implicity) uygulayabiliriz.

?? Operatörü

Bu operatör C# 2.0 ile birlikte geldi ve uzun uzadıya yazdığımız if-else blokları bağlı kalmadan kod yazmamıza olanak sağlıyor. Nullable Value Types’tan hatırlayacağımız üzere Nullable<T> yapısında bulunan GetValurOrDefault() methodunun yaptığı işe benzer bir iş yapıyor. Yani değer null ise ?? operatöründe belirtilen diğer değeri alır.

Null Condition Operatörü (?)

C# 6.0 ile birlikte dile kazandırılan yeni bir operatör. Aslında bakarsanız benim çok hoşuma giden bir özellik. Çünkü bu operatör sayesinde uzun uzadıya if-else bloklarından kurtuluyoruz ve kodlarımızı tek satırda yazabiliyoruz.

Bu özelliği kullanmadan bir nesne üzerinde null-check kontrolü yapmak istediğimizde genelde

Şimdi ise ? operatörünü kullanarak oluşan güzelliğe bakalım 🙂 Tek satırda bu işlemi yapabildik.

? operatörü ile ?? operatörünü kullanarak güzel bir kllanım elde edebiliriz.

Şablon tür (generics) mimarisi ile CLR ve C# dilinde oldukça fazla değişikliğin oluşmasına neden oldu.

Bu yazımda Nullable Value Types (null Değeri Alabilen Veri Tipleri ) hakkında edindiğim bilgileri paylaşmaya çalıştım. Umarım faydalı olmuştur.

Bir sonraki yazımda görüşmek üzere…

Kaynaklar:

Her Yönüyle C# 7.0, Sefer Algan, Pusula Yayincilik

https://docs.microsoft.com/tr-tr/dotnet/csharp/language-reference/builtin-types/nullable-value-types

Leave a Comment