21 Ekim 2011 Cuma

C# Nullable Types

.Net mimarisi içerisindeki değer türlü tipler null değer taşıyamazlar. Zaten “null” değer taşımak, heap’de bir nesneyi işaret etmemek anlamına gelmektedir. Değer türlü tipler nesnelerini stack tarafında tuttuklarından ötürü null değer taşımaları gibi bir durum söz konusu değildir. Ancak bu durum bazen can sıkıcı bir hal almaktadır. Özellikle veri tabanından data çektiğimizde null değerler elde etmemiz muhtemeldir. SQL tarafında tipi integer olan bir kolondan null değerler gelebilir. C# tarafında da bunu ele almak güç durumlara neden olabilmekteydi. C# 2.0 ile gelen generic mimari ile birlikte değer türlü tiplerin null taşıyabilmesi sağlandı. Nullable<T>, generic bir struct’dır.

class Program

    {

        static void Main(string[] args)

        {

            #region 1.Kullanım

 

            Nullable<int> sayi = null;

           

            if (sayi == null)

            {

                Console.WriteLine("sayi adlı değişken null değer taşıyor.");

            }

            else

            {

                Console.WriteLine("sayi adlı değişkenin değeri : {0}", sayi);

            }

 

            #endregion

 

 

            #region 2.Kullanım

 

            int? sayi2 = null;

 

            if (sayi2 == null)

            {

                Console.WriteLine("sayi2 adlı değişken null değer taşıyor.");

            }

            else

            {

                Console.WriteLine("sayi2 adlı değişkenin değeri : {0}", sayi2);

            }

 

            #endregion

 

        }

    }

Yukarıdaki iki kullanım da birebir aynıdır. int? syntax’ı, yazımda kolaylık sağlamak içindir.

Burada dikkat edilmesi gereken nokta, değer türlü tiplerin asla null değer taşıyamamalarıdır. Nullable tip kullanarak, herhangi bir value’ya sahip olup olmadıklarına bakılır. Eğer sahip değillerse null değer taşıyan bir tip muamelesi görürler.

class Program

    {

        static void Main(string[] args)

        {

            int? birinciSayi = 20;

            int? ikinciSayi = null;

 

            if (birinciSayi.HasValue) //eğer içeride değer varsa HasValue true döner, eğer null ise false döner.

            {

                Console.WriteLine("birinciSayi:{0}", birinciSayi.Value); //Value property'si T tipinden bir değer döndürür. Burada T tipi int olduğundan, geriye int döner.

            }

 

            if (!ikinciSayi.HasValue) //null olduğundan HasValue false döndürür.

            {

                Console.WriteLine("ikinciSayi:{0}", ikinciSayi.GetValueOrDefault()); //GetValueOrDefault metodu geriye T tipinden bir değer döndürür. Eğer değer varsa değeri döndürür, null ise T tipinin default değerini döner. Burada

            }

        }

    }

Ekran çıktısı aşağıdaki gibi olacaktır.

image

Son olarak dikkat edilmesi gereken önemli bir nokta da şudur, Nullable tiplerde generic bir kısıt söz konusudur. Sadece değer türlü tiplere uygulanabilirler. (Zaten geliş amaçları da budur). Nullable<string> şeklinde bir tanımlama yapamayız.

 

image



0 yorum:

Yorum Gönder