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 dereferenciálása null lehetséges. Ha engedélyezve van, a fordító figyelmeztetéseket hoz létre, amelyek segítenek elkerülni a System.NullReferenceException kivételdobást, amikor a kód fut.

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, null állapotú értékek esetén, maybe-null és not-null, valamint a nullal jelölt annotációkat. 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 kapni 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.

Megjegyzés

A projekt Nullable beállítását egy <Nullable> címke segítségével jelölheti ki. További információért tekintse meg a Fordító beállításait .

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. A null értékű típusok alapértelmezett letiltása jobban működik, ha a könyvtár stabil, és a fejlesztés fő fókusza 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 a nullérzékenységet engedélyezni kell. Ha a csapat bármely fejlesztője elfelejti, az új kód mostantól a hátralévő munkák listáján van, hogy az összes kód felkészüljön a nullértek kezelésére.

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 a generated_code = true értéket egy olyan szakaszban, amely az adott fájlra vonatkozik.
  2. Helyezzen <auto-generated> vagy <auto-generated/> egy megjegyzést a fájl tetejére. A megjegyzés bármely sorában szerepelhet, de a megjegyzésblokknak a fájl első elemének kell lennie.
  3. Kezdje a fájlnevet a következőkkel: 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ábilitást. Minden típus egy a három null képesség közül rendelkezik:

  • oblivious: Minden hivatkozástípus nullable oblivious, ha az annotációs környezet le van tiltva.
  • nonnullable: Egy nem annotált referencia típus C nemnullable, ha az annotációs környezet engedélyezve van.
  • 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.
  • Nullázható típusok figyelmeztetést okoznak, ha dereferenciálják őket, amikor lehet, hogy null értéket adnak.
  • Az "oblivious" típusok figyelmeztetést váltanak ki, ha dereferálják őket, amikor esetlegesen null értékűek, és a figyelmeztetési 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ékre érzéketlen marad, de figyelmeztetések jelennek meg, ha egy értékre hivatkozik, miután annak null állapotalehet, hogy 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ési státuszban van figyelmeztetések. Így minden típus figyelmen kívül marad, amíg meg nem oldotta az első figyelmeztetések sorát.

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 a nullázhatótól a nem nullázható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ésének első lépéseként annotációkat használ ? a paraméterek és a visszatérési típusok esetében annak jelzésére, hogy mikor lehetnek null argumentumok 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 maybe-null érték az összes paraméterre és visszatérési értékre vonatkozóan. Számos API összetettebb szabályokkal rendelkezik arra vonatkozóan, mikor lehetnek vagy nem lehetnek a változók 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.