C# Academy · leksjon

Migrere en kodebase til NRT

Bruk en trinnvis migreringsstrategi: aktiver advarsler, annoter API-er, rett opp problemer, og unngå falske positiver.

Leksjon 4 av 412 trinn

Migrere en kodebase til NRT er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 4 leksjoner.

Migreringsutfordringen

Hvis De aktiverer NRT i en eksisterende kodebase, får De vanligvis hundrevis av advarsler. En alt-på-en-gang-tilnærming er risikabel. Bruk i stedet en trinnvis migrering: aktiver advarsler gradvis, rett dem fil for fil, og unngå å miste fremdriften.

Trinn 1: Aktiver bare advarsler

Start med <Nullable>warnings</Nullable> i stedet for enable. Dette aktiverer advarsler uten å behandle kode uten annotasjoner som feil – et trygt utgangspunkt.

<!-- 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 -->

Trinn 2: Aktiver per fil

Legg til #nullable enable øverst i hver fil etter hvert som De arbeider med den. Da begrenses endringene til filer De aktivt redigerer, og gjennomganger blir enklere å håndtere.

#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

Kategorisering av advarsler

Advarsler faller i to kategorier: trygge å undertrykke (ORM-entiteter og DI-injiserte felt) og reelle feil (verdier som faktisk er null og blir dereferert). Skill mellom disse før De undertrykker noe.

// 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!
}

Rette konstruktøradvarsel CS8618

CS8618 oppstår når en egenskap som ikke kan være null, ikke settes i konstruktøren. Den anbefalte løsningen er å kreve verdien i konstruktøren. Bruk = null! bare for verdier som settes av rammeverket.

// 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;
    }
}

Håndtering av eldre API-er

Tredjeparts- eller eldre API-er kan mangle annotasjoner. Returtypene deres er oblivious (verken nullable eller non-nullable). Tilordne resultatene deres til nullable variabler for å være tydelig.

// 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

Bruk av #pragma til å undertrykke bestemte advarsler

Når en advarsel faktisk er en falsk positiv, og = null! virker for støyende, kan De bruke #pragma warning disable avgrenset til den aktuelle linjen.

// 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

Behandle NRT-advarsler som feil

Når alle advarsler i en fil er rettet, kan De legge til <WarningsAsErrors>Nullable</WarningsAsErrors> (eller bruke håndheving i CI) for å hindre tilbakefall – alle nye nullable-problemer gjør at byggingen mislykkes.

<!-- After full migration: treat nullable warnings as build errors -->
<PropertyGroup>
  <Nullable>enable</Nullable>
  <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  <!-- Or selectively: -->
  <!-- <WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors> -->
</PropertyGroup>

Annotering av offentlige API-er

Når andre bruker biblioteket Deres, blir NRT-annotasjoner en del av kontrakten for det offentlige API-et. Returner T? når resultatet kan være null, og T når det er garantert å ikke være 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);
}

Måling og sporing av migreringen

Spor fremdriften ved å telle filer med #nullable enable, eller ved å kjøre dotnet build 2>&1 | grep CS86 i CI. Sett en måldato for fullføring av migreringen av hele prosjektet.

# 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

Kort kontroll

Hva kommuniserer tilordningen = null! på en egenskap som ikke kan være null?

Oppsummering: Migrering til NRT

Viktigste punkter:

  • Bruk trinnvis migrering: advarselsmodus → aktivering per fil → global aktivering
  • Skill mellom reelle feil (rett dem) og ORM-/DI-mønstre (bruk = null!)
  • Rett CS8618 ved å kreve verdier i konstruktører, ikke ved å undertrykke advarselen
  • Tilordne resultater fra eldre API-er til T?-variabler for å være tydelig
  • Behandle nullable-advarsler som feil i CI for å hindre tilbakefall
  • Annoterte offentlige API-er blir tydelige kontrakter for brukerne
Gratis å komme i gang

Lær deg C# med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
93
Leksjoner
346

Ofte stilte spørsmål

Er leksjonen «Migrere en kodebase til NRT» gratis?

Ja – hele teksten i «Migrere en kodebase til NRT» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Migrere en kodebase til NRT»?

Bruk en trinnvis migreringsstrategi: aktiver advarsler, annoter API-er, rett opp problemer, og unngå falske positiver. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C# Academy?

Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Migrere en kodebase til NRT»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?

Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Aktivere og forstå NRT
  2. Annoteringer: ?, !, MaybeNull og NotNull
  3. Null-betingede og null-sammenslående operatorer
  4. Migrere en kodebase til NRT
← Tilbake til C# Academy