A feladat bemutatja, hogyan viselkednek a különféle numerikus típusok túlcsorduláskor, vagyis amikor a kapacitásuk nem elegendő egy számítás, például egy aritmetikai művelet vagy egy kasztolás eredményének a tárolására.
byte, ushort, uint, ulong) nullára fordulnak át (a típus maximális értéke + 1 modulusként működik), kivéve, ha nagyjából egy checked blokkon belül szerepelnek, mert akkor OverflowException példány keletkezik. Az int és a long hasonlóan viselkedik, csak éppen int.MinValue-ra, illetve long.minValue-ra fordulnak át.int one = 1;
checked
{
int expr = int.MaxValue + one; // overflow exception is thrown
}
// or
int expr2 = checked(int.MaxValue + one); // overflow exception is thrown
checked állapot csak a blokkban közvetlenül szereplő kifejezésekre vonatkozik. A meghívott függvényekben bekövetkező túlcsordulásokat nem kapja el.float és double típusok végtelen állapotba kerülnek, amelyet a float.IsInfinity() és hasonló metódusokkal lehet vizsgálni.double d = double.MaxValue;
d *= 2d;
Double.IsFinite(d)
// => false
decimal típusú számok OverflowException példányt váltanak ki.unchecked kulcsszó azokra az esetekre, amikor egy checked blokkon belül vissza szeretnéd fordítani az unchecked hatását, vagy amikor a fordító beállítását használtad.A kivétel nélkül bekövetkező túlcsordulások problémásak lehetnek, mert általában igaz, hogy egy hibás állapotot minél korábban jelzünk, annál jobb.
Az int és a float túlcsordulási problémáit enyhítheted azzal, hogy az eredményt long, decimal vagy double típusú változóba mented.
Ha a kódodban elengedhetetlenek a nagy egészek, akkor a BigInteger típus használata is egy lehetőség.
Természetesen vannak olyan esetek, amikor jogos megengedni, hogy egy egész átforduljon, különösen előjel nélküli értékeknél. Klasszikus példa erre a hash-kódok esete, amelyek az egész szélességét egyfajta modulusként használják.
A kódbázisokban általában azt tapasztalod, hogy gyakran nincs ellenőrzés ott, ahol uint-ot vagy ulong-ot használnak azonosítóként, mert többszörös fáradságnak tartják, mint amennyit megér. Ez érvényes akkor is, amikor a felhasználási területből nyilvánvaló, hogy nem fognak nagyon nagy értékek előfordulni. De nézd meg ezt elrettentő példaként.