Koodikannan siirtäminen NRT:hen
Soveltakaa vaiheittaista siirtostrategiaa: ottakaa varoitukset käyttöön, merkitkää API:t annotaatioilla, korjatkaa ongelmat ja välttäkää virheellisiä positiivisia tuloksia.
Koodikannan siirtäminen NRT:hen on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 4 oppituntia.
Siirtymishaaste
NRT:n ottaminen käyttöön olemassa olevassa koodikannassa tuottaa yleensä satoja varoituksia. Koko koodikannan kerralla kattava lähestymistapa on riskialtis. Käyttäkää sen sijaan vaiheittaista siirtymää: ottakaa varoitukset käyttöön vähitellen, korjatkaa ne tiedosto kerrallaan älkääkä antako työn pysähtyä.
Vaihe 1: Ota käyttöön vain varoitukset
Aloita käyttämällä <Nullable>warnings</Nullable>-asetusta enable-asetuksen sijaan. Se ottaa varoitukset käyttöön käsittelemättä merkitsemättömän koodin virheinä — turvallinen lähtökohta.
<!-- Phase 1: warnings only, no breaking change -->
<PropertyGroup>
<Nullable>warnings</Nullable>
</PropertyGroup>
<!-- Phase 2: full enable per file as you migrate -->
<!-- Phase 3: switch to enable globally when done -->Vaihe 2: Ota käyttöön tiedosto kerrallaan
Lisää #nullable enable kunkin tiedoston alkuun, kun työskentelet sen parissa. Näin muutokset rajoittuvat aktiivisesti muokattaviin tiedostoihin ja katselmoinneista tulee hallittavia.
#nullable enable
// Now this file has full NRT analysis
public class OrderService
{
private readonly IOrderRepository _repo;
// Compiler now warns about uninitialized non-nullable fields,
// unsafe dereferences, and assignment to non-nullable
public OrderService(IOrderRepository repo) => _repo = repo;
}
// Other files without #nullable enable are still uncheckedVaroitusten luokittelu
Varoitukset jakautuvat kahteen luokkaan: turvallisesti vaimennettavat varoitukset (ORM-entiteetit ja DI:n injektoimat kentät) sekä todelliset virheet (aidosti null-arvoihin kohdistuvat viittaukset). Erottele nämä toisistaan ennen kuin vaimennat mitään.
// Category 1: safe to suppress with null!
// EF Core navigation properties — set by EF, never null in practice
public class Order
{
public Customer Customer { get; set; } = null!;
}
// Category 2: real bug — must fix
public string GetFullName()
{
return FirstName + " " + LastName; // LastName was string? -- BUG!
}Konstruktorivaroituksen CS8618 korjaaminen
CS8618 ilmoitetaan, kun ei-nullattavaa ominaisuutta ei aseteta konstruktorissa. Suositeltu korjaus on vaatia arvo konstruktorissa. Käytä = null!-merkintää vain kehyksen asettamille arvoille.
// BEFORE (CS8618)
public class Product
{
public string Name { get; set; } // warning
public Category Category { get; set; } // warning
}
// AFTER — constructor required:
public class Product
{
public string Name { get; set; }
public Category Category { get; set; }
public Product(string name, Category category)
{
Name = name;
Category = category;
}
}Vanhojen rajapintojen käsittely
Kolmannen osapuolen tai vanhat rajapinnat eivät välttämättä sisällä annotaatioita. Niiden palautustyypit ovat oblivious-tyyppisiä (eivät nullattavia eivätkä ei-nullattavia). Sijoita niiden tulokset nullattaviin muuttujiin, jotta asia käy eksplisiittisesti ilmi.
// Legacy API returns 'string' but might be null (oblivious type)
string? legacyResult = OldLibrary.GetValue(); // store as nullable
if (legacyResult is null) return;
// Or convert at the boundary:
string safe = OldLibrary.GetValue() ?? "";
// For third-party types, check if they have NRT annotations:
// NuGet packages often add nullable annotations in newer versions#pragma-direktiivin käyttö tiettyjen varoitusten vaimentamiseen
Kun varoitus on aidosti väärä positiivinen tulos ja = null! tuntuu liian häiritsevältä, käytä #pragma warning disable-direktiiviä rajattuna kyseiseen riviin.
// Suppress for a specific case with explanation:
#pragma warning disable CS8618 // ORM populates this via reflection
public DbSet<Product> Products { get; set; }
#pragma warning restore CS8618
// Or inline with a comment:
public DbSet<Order> Orders { get; set; } = null!; // set by EF CoreNRT-varoitusten käsitteleminen virheinä
Kun kaikki tiedoston varoitukset on korjattu, lisää <WarningsAsErrors>Nullable</WarningsAsErrors> (tai käytä CI-valvontaa) estämään tilanteen heikkeneminen — mikä tahansa uusi nullable-ongelma epäonnistuttaa koontiversion.
<!-- After full migration: treat nullable warnings as build errors -->
<PropertyGroup>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<!-- Or selectively: -->
<!-- <WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors> -->
</PropertyGroup>Julkisten rajapintojen annotointi
Kun muut käyttävät kirjastoasi, NRT-annotaatioista tulee osa julkisen rajapintasi sopimusta. Palauta T?, kun tulos voi olla null, ja T, kun tulos on varmasti ei-null.
public interface IProductService
{
// Contract: FindById MAY return null, GetById never does
Product? FindById(int id);
Product GetById(int id); // throws if not found
// Collection: never null (may be empty)
IReadOnlyList<Product> GetAll();
// String: may be empty but not null
string GetSummary(int id);
}Siirtymän mittarit ja seuranta
Seuraa edistymistä laskemalla #nullable enable-merkinnän sisältävien tiedostojen määrä tai suorittamalla CI:ssä dotnet build 2>&1 | grep CS86. Aseta tavoitepäivä koko projektin siirtymälle.
# Count NRT warnings in current build
dotnet build 2>&1 | grep -c 'CS860[0-9]\|CS861[0-9]\|CS862[0-9]'
# List files still missing #nullable enable
grep -rL '#nullable enable' src/ --include='*.cs'
# Track in CI: fail if warning count increases
# Set a budget: warnings <= N, where N decreases each sprintPikakertaus
Mitä = null! -sijoitus ei-nullattavaan ominaisuuteen ilmaisee?
Kertaus: siirtyminen NRT:n käyttöön
Keskeiset opit:
- Käytä vaiheittaista siirtymää: varoitustila → tiedostokohtainen käyttöönotto → käyttöönotto koko projektissa
- Erota todelliset virheet (korjaa ne) ORM- ja DI-malleista (käytä
= null!-merkintää) - Korjaa CS8618 vaatimalla arvot konstruktoreissa sen sijaan, että vaimentaisit varoituksen
- Sijoita vanhojen rajapintojen tulokset
T?-muuttujiin, jotta mahdollinen null-arvo käy ilmi - Käsittele nullable-varoituksia CI:ssä virheinä, jotta ongelmat eivät palaa
- Annotoidut julkiset rajapinnat muodostavat selkeät sopimukset niiden käyttäjille
Opi C# tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 93
- Oppitunnit
- 346
Usein kysytyt kysymykset
Onko oppitunti ”Koodikannan siirtäminen NRT:hen” ilmainen?
Kyllä – oppitunnin ”Koodikannan siirtäminen NRT:hen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Koodikannan siirtäminen NRT:hen”?
Soveltakaa vaiheittaista siirtostrategiaa: ottakaa varoitukset käyttöön, merkitkää API:t annotaatioilla, korjatkaa ongelmat ja välttäkää virheellisiä positiivisia tuloksia. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Koodikannan siirtäminen NRT:hen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?
Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- NRT:n käyttöönotto ja ymmärtäminen
- Annotaatiot: ?, !, MaybeNull ja NotNull
- Null-ehdolliset ja null-yhdistämisoperaattorit
- Koodikannan siirtäminen NRT:hen