A C# 8.0 legnagyobb újdonsága a nullable reference types, ami kicsit félrevezető név.
A referencia tÃpusok eddig is felvehettek null értéket. Ha azt nem kezeltük le, hogy egy referencia null értéket is felvehet és úgy próbáltunk rajta metódust hÃvni, vagy tulajdonságot lekérdezni/Ãrni, akkor NullReferenceException tÃpusú kivételt kaptunk.
Ez pedig sajnos a "legnépszerűbb" futásidejű hiba tÃpussá nÅ‘tte ki magát az elmúlt jó pár évben. Ez alatt az értendÅ‘, hogy a fejlesztÅ‘k leginkább ilyen kivételekkel találkoznak fejlesztés közben, ha nem jól Ãrják meg a kódjukat. RelatÃve nehéz is megtalálni az ilyen hiba eredetét, hisz lehet, hogy egy távoli kódrész meghÃvása miatt lett null az adott változó értéke, és a hibával jóval késÅ‘bb a használatakor szembesülünk.
Ebben hivatott segÃteni a nullable reference types bevezetése. Ez a gyakorlatban azt jelenti, hogy a ? operátort ki kell tennünk referencia tÃpusok esetén, ha azt szeretnénk jelezni, hogy az a változó megengedett, hogy null értéket vegyen fel.
Ebben az esetben, ha elmulasztjuk a null ellenÅ‘rzést, akkor már fordÃtási idejű figyelmeztetést kapunk.
Ha pedig nem jeleztük, hogy a változó null értéket is felvehet, akkor a fordÃtó a változót úgy fogja kezelni, mint ami referencia, de normál körülmények között nem lenne szabad neki null értéket felvennie. Ebben az esetben a null check elmulasztása szintén fordÃtási idejű figyelmeztetést fog generálni.
Nézzük meg az alábbi példakódot:
using System;
namespace NullableDisabled
{
public static class Program
{
public static void Main(string[] args)
{
string s = null;
Console.WriteLine(s.Length);
}
}
}
Ez futási idÅ‘ben NullReferenceException kivételt fog generálni, mert s értéke null. Ha engedélyezzük a nullable reference types használatát, akkor bizony fordÃtáskor már figyelmeztetést kapunk:
A figyelmezetések közül a leghasznosabb, hogy konkrétan már fordÃtási idÅ‘ben jelzi a fordÃtó, hogy az s.Length hÃvásakor s értéke null lehet. Továbbá figyelmeztetést kapunk arról is, hogy a változót nem jelöltük meg nullable referenciaként, ennek ellenére null értéket adunk neki.
Engedélyezés
A szolgáltatás alapesetben ki van kapcsolva .NET 6 előtti keretrendszereken. Ennek az oka az, hogy hatékonyan csak a .NET Core 3.0 vagy újabb keretrendszerrel működik.
A másik nagy ok az alapértelmezetten kikapcsolt állapot mellett az, hogy ez egy olyan szolgáltatás, ami a már megÃrt C# kódok többségénél több száz, vagy ezer fordÃtási figyelmeztetést okozna. A sok figyelmezetetés között pedig könnyen elvesznének más figyelmeztetések.
A szolgáltatást több módon aktiválhatjuk. Projekt szintű engedélyezéshez a projekt fájlt kell módosÃtanunk és kiegészÃtenünk az alábbi xml tagokkal:
<PropertyGroup>
<Nullable>enable</Nullable>
</PropertyGroup>
.NET 6 óta az újonnan létrehozott projektek esetén be van kapcsolva a szolgáltatás és kikapcsolni csak akkor érdemes, ha régen Ãrt kódot kell átemelnünk. Az újonnan létrehozott projektek és kódok esetén azonban sokat tud segÃteni ez az annotáció.
Fájl szinten is kontrollálhatjuk a nullable viselkedést. Ehhez "elÅ‘feldolgozó" utasÃtásokat definiáltak, amelyek a következÅ‘k:
#nullable enable
Nullable figyelmeztetések és IntelliSense engedélyezése.
#nullable disable
Nullable figyelmeztetések és IntelliSense kikapcsolása, letiltása.
#nullable restore
Nullable figyelmeztetések és IntelliSense beállÃtása a projektben meghatározott alapértelmezésre.
#nullable disable warnings
Nullable fordÃtási figyelmeztetések letiltása.
#nullable enable warnings
Nullable fordÃtási figyelmeztetések engedélyezése.
#nullable restore warnings
Nullable fordÃtási figyelmeztetések beállÃtása a projektben meghatározott alapértelmezésre.
#nullable disable annotations
Nullable IntelliSense segÃtségek letiltása.
#nullable enable annotations
Nullable IntelliSense segÃtségek engedélyezése.
#nullable restore annotations
Nullable IntelliSense segÃtségek beállÃtása a projektben meghatározott alapértelmezésre.