2 Nisan 2012 Pazartesi

C# 'da CHECKED - UNCHEKED Kontrolleri

Bir değişkenin sınırları aşıldığında Overflow hatası verir veya beklemediğimiz sonuçlarla karşılaşırız. Mesela, çok büyük iki tam sayıyı çarptığımızda sonuç tamsayı türünün sınırlarını aşıyorsa doğru sonuç yerine değişik rakamlarla karşılaşırız. Bu durumların önüne geçebilmek için hata kontrollerinde checked - unchecked anahtar kelimelerini kullanacağız. Cheked ve unchecked belirlemeleri, tip dönüşümlerinde güvenliği arttırmak için düşünülmüştür.

Bu belirlemelerin hem operator biçimi hem de deyim biçimi vardır.
Operator biçimi :
//Checked durumu
Checked(islem)
//Unchecked durumu
Unchecked(islem)

Deyim biçimi :
//Checked durumu
Checked
{
            //islem
}
//Unchecked durumu
Unchecked
{
            //islem
}

Eğer operator parantez içinde yada deyim içerisinde değilsek, varsayılan(default) durumunun hangisi olacağına derleyici, yazılımcıya bırakmıştır. Microsoft C# derleyicilerinde varsayılan durum unchecked durumudur.

int i = 1000;
b = (byte)i;

///yada

unchecked
{
       int i = 1000;
       b = (byte)i;
}

Bu kod satırlarında b'nin son değeri 232'dir. Varsayılan değer uncheked demiştik. Int'in değerinin, byte'ın max değerine göre modunu alıp gösterir.

checked
{
       int i = 1000;
       b = (byte)i;
}

Yukarıdaki kod satırında ise önceki kod satırlarını checked skoplarına aldım. Bu durumda run-time 'da Overflow hatası verecektir.

Eğer çalışmasını istediğimiz kodu sadece try-catch bloğuna yerleştirirsek, unchecked ile eş değer olur ve sonucun hatalı olduğu konusunda bilgi sahibi olamayız. try-catch bloğunda ayrıca checked yerleştirirsek, overflow hatalarını kontrol etme imkanımız olmaktadır.

unchecked
{
         int sayi1 = 1000000000;
                int sayi2 = 1000000000;
                MessageBox.Show((sayi1 * sayi2).ToString());
}

///yada

try
{
                int sayi1 = 1000000000;
                int sayi2 = 1000000000;
                MessageBox.Show((sayi1 * sayi2).ToString());
}
catch(Exception ex)
{
                MessageBox.Show(ex.Message);
}

Bu durumlarda sonuç, 10 üzeri 18 olması gerekirken, -1 milyar küsürlü bir rakamla karşılaşırız. Bu durum şunu göstermekte ; aritmetik değişken türlerinde overflow hatası yerine değişik sonuçlar karşımıza çıkmaktadır. Bu bir hatadır fakat bu durumun bir hata olup olmadığını anlamak açısından try bloğuna aldığımız kodları aynı zamanda checked bloğuna da alalım :

try
{
                checked
                {
                               int sayi1 = 1000000000;
                               int sayi2 = 1000000000;
                               MessageBox.Show((sayi1 * sayi2).ToString());
                }
}
catch(Exception ex)
{
                string hata = ex.ToString();             
                MessageBox.Show(ex.Message,hata.Substring(0,hata.IndexOf(':')));
}
Checked anahtar kelimesiyle bu işlemin hatalı olduğunu öğrenmiş olduk. Bu durumda catch bloğunda exception yerine overflow exception kontrolünü yaparız.

Hiç yorum yok:

Yorum Gönder