msHOWTO

2 Nisan 2012 Pazartesi

C # da Checked ve Unchecked Nedir ?

Merhaba arkadaşlar. Bu makalemde bir değişkene değer atarken oluşacak hatayı nasıl yakalayacağımıza değineceğim.Biraz günlük hayata dönelim.En basitinden bir örnek vermek gerekirse çok susadınız ve su içeceksiniz.Sürahide bir miktar su var ve elinizde de su bardağı olduğunu düşünelim.Bilinci yerinde bir insanın suyu bardağa boşaltmadan önce sürahide ne kadar su olduğunu kontrol etmesi ve bardak kadar su dökmesi gerekmektedir . Bu şekilde yaparsanız herhangi bir bardaktan taşma olmaz değil mi ? Fakat kontrol etmeden direk bütün suyu bardağa boşaltmaya kalkarsanız bardak dolduktan sonra taşma yaşanacaktır.İşte tam bu nokta da yazılım dünyasına geri dönelim.
Not : Bu aşamada console uygulaması üzerinden anlatıma devam edeceğim.
namespace checked_unchecked
{
    class Program
    {
        static void Main(string[] args)
        {
            byte a;
            int i = 256;
                a = (byte)i;
                Console.WriteLine(a.ToString());
                Console.ReadKey();
          
        }
    }
}

Şeklinde bir atama işlemi yaptığımızda Run Time anında herhangi bir exception fırlatmaz ve sonuç olarak da 0 değerini döndürür.Bunun sebebi de Cast işlemi yapıldığında Cast yapılan değerin atanacağı değişkenin maximum değerinin mod işleminden kalanı vermesidir.



Fakat bu dönen sonuç aslında IDE nin kendi exception döndürmemek için başvurduğu bir yöntemdir.Bu bilinçsizce su doldurmaya benzer.Biz sürehiden suyu dolduruyoruz fakat dışarıdan biri durumu kurtarıyor.İşte tam bu noktada bu kontrol işini IDE ye bırakmamak için atama işlemini checked bloğuna yazmamız gerekmektedir.

byte a;
            int i = 256;
            checked
            {
                a = (byte)i;
                Console.WriteLine(a.ToString());
                Console.ReadKey();
            }

Bu şekilde yapıldığında intellisense bir hata vermez ve derleme esnasında exception fırlatır.




Bu şekilde yapınca şimdi sizce ne oldu ? Sürahiden suyu boşaltırken kontrol işlemini yapmış olduk ve bardak dolana kadar suyumuzu koyduk.Eğer unchecked blokları arasına kodumuzu yazmış olsaydık bize tekrar hata fırlatmadan sonuç olarak 0 değerini döndürecekti.Yani buradan visual studio da default olarak uncheced ayarlıdır.

Şimdi ne oldu ? Checked blokları arasına kodumuzu yapıştırdık ama programımız çalışmadı.Hatta derlenmedi bile… İşte bu kontrolu try catch blokları içine yazıp catch de de oluşan hatayı kullanıcının anlayabileceği şekilde göstermek en doğru ve olması gereken şey olacaktır.

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

Hiç yorum yok:

Yorum Gönder