C# esetén a referencia típusok felvehetnek null értéket, ami önmagában nem probléma.
A null érték akkor probléma, ha egy null értékű referencia típus metódusát vagy tulajdonságát szeretnénk elérni. Ebben az esetben egy NullreferenceException kivétel keletkezik, amit ha a kódunkban nem kezelünk, akkor az könnyen a program összeomlásához vezethet.
Sajnos a tapasztalat szerint a legtöbb összeomlás elmulasztott null ellenőrzésekből akad. Ezért minden null értéket felvehető változó értékét érdemes megnézni, hogy tényleg null-t tartalmaz-e, mielőtt használjuk. Ha egy más által készített osztálykönyvtárat használunk, akkor az osztály publikusan elérhető metódusait és tulajdonságait érdemes használat előtt null ellenőrizni.
Példaként nézzünk meg egy egyszerű programot:
using System;
namespace PeldaNullceck
{
class Program
{
static void Main(string[] args)
{
string test = null;
if (test != null)
{
Console.WriteLine(test.Length);
}
Console.ReadKey();
}
}
}
A fenti kódrészletben semmi érdekes nincs, eddig tanult nyelvi elemekből áll. Viszont, ha a referencia típusunk további referencia típusokat publikál, amiket szintén használunk, akkor az if utasítás igen bonyolulttá tud válni. (A string típus esetén null ellenőrzésre a string.IsNullOrEmpty() metódust érdemes alkalmazni, mivel a legtöbb esetben az üres szövegnek sincs értelme)
Ezért nyelvi segítségként a C# 6.0 bevezette a Null propagation operátorokat a ? és ?? formájában.
A ? operátor
A fenti példában szereplő kód egyszerűsíthető a ? operátor használatával:
using System;
namespace PeldaNullcheck2
{
class Program
{
static void Main(string[] args)
{
string test = null;
Console.WriteLine(test?.Length);
Console.ReadKey();
}
}
}
Mint látható, a ? operátor használata jelentősen növeli a program egyszerűségét és olvashatóságát és az igazán szép benne az, hogy az egyszerűsített kód ugyanolyan null ellenőrző if utasításokkal fordul, mint a fenti kód.
A ?? operátor
A dupla kérdőjel egy if-else szerkezetes null ellenőrzésre fordul. Ha a ?? előtti rész null értéket vesz fel, akkor a ?? utáni kódrészlet fog lefutni. Így például alapértelmezett értékeket állíthatunk be:
using System;
namespace pelda_nullcheck2
{
class Program
{
static void Main(string[] args)
{
string test = null;
Console.WriteLine(test?.Length ?? 0);
Console.ReadKey();
}
}
}
A program kimenete:
0