Korábban emlÃtésre került, hogy a fordÃtó túlcsordulás ügyileg ellenÅ‘rzi a számokat abban az esetben, ha a szám értékérÅ‘l már fordÃtási idÅ‘ben megállapÃtható, hogy túl fog csordulni. Ez gyakorlatban azt jelenti nekünk, hogy fordÃtási hibát kapunk például az alábbi kódrészlet esetén:
byte szam = 254 + 2;
Ami miatt hibát kapunk az annak köszönhetÅ‘, hogy a kifejezés jobb oldala konstans, vagyis már fordÃtáskor kiértékelhetÅ‘ és a 256 (254 + 2) nagyobb szám, mint a byte tÃpus kapacitása, ami 255.
Ez az ellenörzés csak a fordÃtási idÅ‘ben meghatározható számokra vonatkozik. Ha futtatási idÅ‘ben is szeretnénk ezt az ellenÅ‘rzést érvényesÃteni, akkor checked kód blokkban kell elvégeznünk a műveletünket. A checked kód blokk belsejében elhelyezett egész számokon végzett műveletek OverflowException tÃpusú kivételt váltanak ki túlcsordulás esetén, amit ha nem kezelünk le kivételkezeléssel (lásd késÅ‘bb), akkor a programunk összeomlik.
LehetÅ‘ségünk van unchecked kód blokkban ezen ellenÅ‘rzés kikapcsolására. Az unchecked kód blokkban történÅ‘ műveletvégzés esetén a számok simán túlcsordulhatnak fordÃtási és futási idÅ‘ben is a tÃpus által meghatározott maximum értéken.
Az alábbi kódrészlet a Checked és Unchecked kontextus használatát mutatja be:
using System;
namespace PeldaUncheckedChecked
{
class Program
{
static void Main(string[] args)
{
unchecked
{
//nem okoz problémát, mert unchecked blokk
int ertek = int.MaxValue + 100;
checked
{
try
{
//mivel checked blokkban vagyunk kivétel
//fog keletkezni
int ertek2 = int.MaxValue;
ertek2 *= 2;
}
catch (OverflowException)
{
Console.WriteLine("Tulcsordult");
}
}
Console.WriteLine(ertek);
Console.ReadKey();
}
}
}
}
A program kimenete:
Tulcsordult
-2147483549
A fenti példában az érték futtatás közben egy negatÃv szám lesz. Ez amiatt következik be, mert az int.MaxValue mezÅ‘ az int tÃpus maximális értékét tárolja. Itt még az elÅ‘jel bit 0 értékű. Viszont ha ehhez hozzáadunk 100-at, akkor a szám már nem fér el a tartományon, ezért az elÅ‘jel bit a túlcsordulás következtében átbillen 1 értékre.
Az ertek2 kiértékelésekor OverflowException kivétel keletkezik, mint látható a példából. Az unchecked kulccszót nem kell minden esetben kiÃrnunk a programunkban, mivel az alapértelmezett működés az, hogy futási idÅ‘ben nincs egész számok esetén túlcsordulás ellenÅ‘rzés. Az unchecked blokknak akkor van jelentÅ‘sége, ha egy amúgy checked blokkon belül szeretnénk olyan számÃtást végezni, ahol nem baj a túlcsordulás.