C# Academy · Oppitunti

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.

Oppitunti 4/412 vaihetta

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 unchecked

Varoitusten 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 Core

NRT-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 sprint

Pikakertaus

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
Aloita maksutta

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

  1. NRT:n käyttöönotto ja ymmärtäminen
  2. Annotaatiot: ?, !, MaybeNull ja NotNull
  3. Null-ehdolliset ja null-yhdistämisoperaattorit
  4. Koodikannan siirtäminen NRT:hen
← Takaisin: C# Academy