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:
- 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á. - 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. - 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. - 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:
- A .editorconfig fájlban adja meg
generated_code = true
az adott fájlra vonatkozó szakaszt. - 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. - Indítsa el a fájlnevet TemporaryGeneratedFile_
- 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ó,
C
ha 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áltvar
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 var
vá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 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 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.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: