Migrere en kodebase til NRT
Bruk en trinnvis migreringsstrategi: aktiver advarsler, annoter API-er, rett opp problemer, og unngå falske positiver.
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 uncheckedKategorisering 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 versionsBruk 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 CoreBehandle 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 sprintKort 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
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
- Aktivere og forstå NRT
- Annoteringer: ?, !, MaybeNull og NotNull
- Null-betingede og null-sammenslående operatorer
- Migrere en kodebase til NRT