Null értékű hivatkozástípusokkal rendelkező kódbázis frissítése a null értékű diagnosztikai figyelmeztetések javítása érdekében

A null értékű hivatkozástípusok lehetővé teszik annak deklarálását, hogy egy referenciatípus változóihoz nem kell-e értéket rendelni null . Ennek a funkciónak a legfontosabb előnye a fordító statikus elemzése és figyelmeztetései, amikor a kód elhalasztása null lehetséges. Ha engedélyezve van, a fordító figyelmeztetéseket hoz létre, amelyek segítenek elkerülni a kód futtatásakor történő dobásokat System.NullReferenceException .

Ha a kódbázis viszonylag kicsi, bekapcsolhatja a funkciót a projektben, kezelheti a figyelmeztetéseket, és élvezheti a továbbfejlesztett diagnosztika előnyeit. A nagyobb kódbázisokhoz strukturáltabb megközelítésre lehet szükség a figyelmeztetések időben történő kezeléséhez, ami lehetővé teszi, hogy a funkció bizonyos típusú vagy fájlokkal kapcsolatos figyelmeztetések kezelésekor is elérhető legyen. Ez a cikk a kódbázis frissítésére vonatkozó különböző stratégiákat és az ezekkel a stratégiákkal kapcsolatos kompromisszumokat ismerteti. A migrálás megkezdése előtt olvassa el a null értékű referenciatípusok elméleti áttekintését. Ismerteti a fordító statikus elemzését, a maybe-null és a not-null null értékeket, valamint a null értékű széljegyzeteket. Miután megismerte ezeket a fogalmakat és kifejezéseket, készen áll a kód migrálására.

A migrálás megtervezése

A kódbázis frissítésétől függetlenül a cél az, hogy a projektben engedélyezve legyenek a null értékű figyelmeztetések és a null értékű széljegyzetek. Ha eléri ezt a célt, a projektben meg fogja adnia a <nullable>Enable</nullable> beállítást. A beállítások máshol történő módosításához nincs szükség az előfeldolgozási irányelvek egyikére sem.

Az első választás a projekt alapértelmezett beállítása. A lehetőségek a következők:

  1. Alapértelmezés szerint null értékű letiltás: a letiltás az alapértelmezett, ha nem ad hozzá Nullable elemet a projektfájlhoz. Ezt az alapértelmezett beállítást akkor használja, ha nem ad hozzá aktívan új fájlokat a kódbázishoz. A fő tevékenység a kódtár frissítése null értékű hivatkozástípusok használatára. Az alapértelmezett beállítás azt jelenti, hogy a kód frissítésekor minden fájlhoz null értékű előfeldolgozási direktívát ad hozzá.
  2. Null értékű engedélyezés alapértelmezettként: Állítsa be ezt az alapértelmezett beállítást, amikor aktívan fejleszt új funkciókat. Azt szeretné, hogy minden új kód részesüljön a null értékű hivatkozástípusokból és a null értékű statikus elemzésekből. Az alapértelmezett beállítás azt jelenti, hogy minden fájl tetejére fel kell vennie egy-egy #nullable disable fájlt. Ezeket az előfeldolgozási irányelveket az egyes fájlok figyelmeztetéseinek kezelésekor távolítja el.
  3. Null értékű figyelmeztetések alapértelmezettként: Válassza ezt az alapértelmezett beállítást kétfázisú migráláshoz. Az első fázisban foglalkozz a figyelmeztetésekkel. A második fázisban kapcsolja be a széljegyzeteket a változó várható nullállapotának deklarálásához. Az alapértelmezett beállítás azt jelenti, hogy minden fájl tetejére fel kell vennie egy-egy #nullable disable fájlt.
  4. Alapértelmezés szerint null értékű széljegyzetek . A figyelmeztetések kezelése előtt jegyzetelje a kódot.

Ha alapértelmezés szerint engedélyezi a null értéket, több előtéri munka jön létre az előfeldolgozási irányelvek minden fájlhoz való hozzáadásához. Ennek az az előnye, hogy a projekthez hozzáadott összes új kódfájl null értékű lesz. Minden új munka null értékű lesz; csak a meglévő kódot kell frissíteni. Ha az alapértelmezett érték nem tiltja le a null értékűt, az jobban működik, ha a kódtár stabil, és a fejlesztés fő célja a null értékű referenciatípusok bevezetése. Az API-k jegyzetelésekor bekapcsolhatja a null értékű hivatkozástípusokat. Ha végzett, null értékű hivatkozástípusokat engedélyez a teljes projekthez. Új fájl létrehozásakor hozzá kell adnia az előfeldolgozási irányelveket, és null értékűvé kell tenni. Ha a csapat bármely fejlesztője elfelejti, hogy az új kód már a munka hátralékában van, hogy az összes kód null értékű legyen.

Ezen stratégiák közül melyiket választja, attól függ, hogy mennyi aktív fejlesztés zajlik a projektben. Minél érettebb és stabilabb a projektje, annál jobb a második stratégia. Minél több funkciót fejlesztenek, annál jobb az első stratégia.

Fontos

A globális null értékű környezet nem vonatkozik a létrehozott kódfájlokra. Mindkét stratégia esetében a null értékű környezet le van tiltva minden létrehozottként megjelölt forrásfájl esetében. Ez azt jelenti, hogy a létrehozott fájlokban lévő API-k nincsenek széljegyzetekkel elosztva. A fájlokat négyféleképpen lehet generáltként megjelölni:

  1. A .editorconfig fájlban adja meg generated_code = true az adott fájlra vonatkozó szakaszt.
  2. Tegyen <auto-generated> vagy <auto-generated/> írjon megjegyzést a fájl tetején. A megjegyzés bármely sorában szerepelhet, de a megjegyzésblokknak a fájl első elemének kell lennie.
  3. Indítsa el a fájlnevet TemporaryGeneratedFile_
  4. Fejezze be a fájlnevet .designer.cs, .generated.cs, .g.cs vagy .g.i.cs.

A generátorok az előfeldolgozási #nullable irányelv használatával is bejelentkezhetnek.

Környezetek és figyelmeztetések ismertetése

A figyelmeztetések és széljegyzetek engedélyezése szabályozza, hogy a fordító hogyan tekinti meg a hivatkozástípusokat és a null értéket. Minden típus három nulla képesség egyikével rendelkezik:

  • oblivious: Minden hivatkozástípus null értékű , ha a széljegyzetkörnyezet le van tiltva.
  • nemnullable: A nem névtelen hivatkozástípus nem használható, Cha engedélyezve van a széljegyzetkörnyezet.
  • null értékű: A jegyzetekkel ellátott hivatkozástípus C?null értékű, de figyelmeztetést adhat ki, ha a széljegyzetkörnyezet le van tiltva. Ha a jegyzetkörnyezet engedélyezve van, a deklarált var változók null értékűek.

A fordító a nullhihetőség alapján generál figyelmeztetéseket:

  • a nemnullable típusok figyelmeztetést okoznak, ha egy lehetséges null érték van hozzájuk rendelve.
  • a null értékű típusok figyelmeztetést okoznak, ha ha esetleg null értéket adnak meg.
  • Az oblivious típusok figyelmeztetést okoznak, ha a rendszer halasztja őket, ha esetleg null értékű, és a figyelmeztető környezet engedélyezve van.

Minden változónak van egy alapértelmezett null értékű állapota, amely a nullképességétől függ:

  • A null értékű változók alapértelmezett null-állapotatalán-null.
  • A nem null értékű változók alapértelmezett null-állapotanem null.
  • A null értékű oblivious változók alapértelmezett null-állapotanem null.

A null értékű hivatkozástípusok engedélyezése előtt a kódbázis összes deklarációja null értékű. Ez azért fontos, mert azt jelenti, hogy minden referenciatípus alapértelmezett null-állapotanem null.

Figyelmeztetések kezelése

Ha a projekt az Entity Framework Core-t használja, olvassa el a null értékű referenciatípusok használatával kapcsolatos útmutatójukat.

A migrálás indításakor először csak figyelmeztetéseket kell engedélyeznie. Az összes deklaráció továbbra is null értékű marad, de figyelmeztetések jelennek meg, ha egy értéket elhalaszt, miután a null állapot esetleg null értékűre változik. A figyelmeztetések kezelése során több helyen ellenőrzi a null értéket, és a kódbázis rugalmasabbá válik. A különböző helyzetek speciális technikáinak megismeréséhez tekintse meg a null értékű figyelmeztetések feloldására szolgáló technikákról szóló cikket.

A többi kód használata előtt kezelheti a figyelmeztetéseket, és engedélyezheti a széljegyzeteket az egyes fájlokban vagy osztályokban. A típusjegyzetek engedélyezése előtt azonban gyakran hatékonyabb kezelni a létrehozott figyelmeztetéseket, miközben a környezet figyelmeztetés. Így minden típusnak feledésbe kell iktatása, amíg meg nem oldotta az első figyelmeztetéseket.

Típusjegyzetek engedélyezése

Az első figyelmeztetési csoport kezelése után engedélyezheti a jegyzetkörnyezetet. Ez megváltoztatja a referenciatípusokat az oblivioustól a nem említhetőig. Minden deklarált varváltozó null értékű. Ez a módosítás gyakran új figyelmeztetéseket vezet be. A fordító figyelmeztetéseinek kezelése első lépése, hogy széljegyzeteket használ ? a paraméteren és a visszatérési típusokon annak jelzésére, hogy mikor lehetnek nullargumentumok vagy visszatérési értékek. Ebben a feladatban a cél nem csak a figyelmeztetések javítása. A fontosabb cél az, hogy a fordító megértse a lehetséges null értékekre vonatkozó szándékot.

Az attribútumok kiterjesztik a típusjegyzeteket

Több attribútumot is hozzáadtunk a változók null állapotával kapcsolatos további információk kifejezéséhez. Az API-k szabályai valószínűleg bonyolultabbak, mint a not-null vagy a talán-null érték az összes paraméter és a visszatérési értékek esetében. Számos API összetettebb szabályokkal rendelkezik arra az esetben, ha a változók nem.null Ezekben az esetekben attribútumokkal fejezi ki ezeket a szabályokat. Az API szemantikáját leíró attribútumok a null értékű elemzést befolyásoló attribútumokról szóló cikkben találhatók.

Következő lépések

Miután a széljegyzetek engedélyezése után az összes figyelmeztetést megoldotta, beállíthatja, hogy a projekt alapértelmezett környezete engedélyezve legyen. Ha a kódban hozzáadott bármilyen pragmát a null értékű széljegyzethez vagy figyelmeztetési környezethez, eltávolíthatja őket. Idővel új figyelmeztetések jelenhetnek meg. Olyan kódot írhat, amely figyelmeztetéseket vezet be. Előfordulhat, hogy a kódtár függősége null értékű referenciatípusok esetén frissíthető. Ezek a frissítések a kódtárban lévő típusokat nullázhatóról nem módosíthatóra vagy null értékűre módosítják.

Ezeket a fogalmakat a C# null értékű biztonságáról szóló Learn modulban is megismerheti.