arckép

Neuwirth István

programtervező informatikus MSc – ELTE

Computational and Software Techniques MSc – Cranfield, UK

Elérhetőség
pitta2@gmail.com
+36 30 329 3039

Valid XHTML 1.0 Transitional

Valid CSS!

Nullable típusok

Az adatbázisoknál megszokott, hogy egy mezőnek valamilyen tényleges érték helyett adhatunk null értéket is, jelezve, hogy itt nem definiált adatról van szó. A C# nyelv beépített támogatást nyújt ilyen, nullázható típusok megvalósítására.

nullable sampleAz adatbázisoknál megszokott, hogy egy mezőnek valamilyen tényleges érték helyett adhatunk null értéket is, jelezve, hogy itt nem definiált, hiányzó adatról van szó. Hasonló elv jól jön például a feltételes maximumkeresés, illetve hasonló jellegű függvények megvalósításakor. Normál esetben (például C++-ban) visszatérhetünk egy logikai értékkel és egy referenciával, vagy egy saját magunk által meghatározott struktúrával, ami tartalmaz egy logikai változót és egy maximumértéket tároló változót. C# alatt megtehetjük ezt másként is: az int? feltmaxker(int[] tomb, ...) függvény null-lal tér vissza, ha nincs a megadott feltételnek megfelelő maximum, illetve egy maximumértékkel, ha van.

A C# 2.0 legnagyobb újítása a generikus típusok bevezetése volt. Ennél kisebb jelentőségű, de a generikus típusokhoz erősen kötődő újítás volt a nullable típusok, azaz nullázható típusok megjelenése. A nyelvben (és úgy általában a .Net-ben) teljesítménybeli megfontolások alapján vannak külön referenciatípusok (osztályok) és értéktípusok (int, char, string, struct, …). Értéktípusnak nem adhatunk null értéket, egy int a = null; sor hibát ad. Ellenben a System.Nullable<int> a = null; és System.Nullable<int> a = 10; is helyes. A nyelv lehetőséget ad a fentiek rövidítésére, így elég egy int? a = null; vagy int? a = 10; sort írnunk. Ha megnézzük az IL kódot, láthatjuk, hogy mindkét megoldás ugyanarra az alakra fordul.

Egy nullázható típusnak két fontos tulajdonsága van: egy HasValue logikai értékű tulajdonság annak eldöntésére, hogy a változónak van-e értéke, vagy null értékű-e, illetve egy Value tulajdonság, amely visszaadja a tárolt értéket, ha volt, máskülönben InvalidOperationException típusú kivételt kapunk.

Ha két nullázható típusú változón műveletet végzünk, az eredmény null lesz, ha legalább az egyik null. (Például int? a = null; int? b = 5; esetén a * b null lesz.) Ez alól kivétel a bool típus, ahol az & és | műveletek a háromértékű logika szabálya szerint (SQL-lel kompatibilis módon) kerülnek végrehajtásra.

A nullázható típusokhoz kötődik még egy újonnan bevezetett operátor: a ??. A következő feltételes operátoros kifejezés: int? a = ...; int b = !a.HasValue ? 0 : a.Value; átírható egyszerűbb alakra a ?? operátorral: int b = a ?? 0;. Azaz ha ’a’ nem nulla, akkor ’a’ értéke, máskülönben egy megadott szám legyen ’b’ értéke.

Látható tehát, hogy a nullázható típusok sokrétűen felhasználhatók, és nem csak adatbázisprogramozással kapcsolatosan. A nyelvi támogatásnak köszönhetően pedig tömören írhatunk le velük bonyolultabb kifejezéseket is.