Eine Codebasis auf NRT migrieren
Wenden Sie eine schrittweise Migrationsstrategie an: Aktivieren Sie Warnungen, annotieren Sie APIs, beheben Sie Probleme und vermeiden Sie Fehlalarme.
Eine Codebasis auf NRT migrieren ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Die Herausforderung der Migration
Das Aktivieren von NRT in einer bestehenden Codebasis erzeugt typischerweise Hunderte von Warnungen. Ein Big-Bang-Ansatz ist riskant. Verwenden Sie stattdessen eine schrittweise Migration: Aktivieren Sie Warnungen nach und nach, beheben Sie sie Datei für Datei und verlieren Sie nie den Fortschritt aus dem Blick.
Schritt 1: Nur Warnungen aktivieren
Beginnen Sie mit <Nullable>warnings</Nullable> statt mit enable. Dadurch werden Warnungen aktiviert, ohne nicht annotierten Code als Fehler zu behandeln – ein sicherer Ausgangspunkt.
<!-- 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 -->Schritt 2: Pro Datei aktivieren
Fügen Sie #nullable enable am Anfang jeder Datei hinzu, sobald Sie daran arbeiten. Dadurch bleiben die Änderungen auf die Dateien beschränkt, die Sie gerade bearbeiten, und Code-Reviews werden überschaubar.
#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 uncheckedWarnungen kategorisieren
Warnungen fallen in zwei Kategorien: gefahrlos unterdrückbar (ORM-Entitäten, durch DI injizierte Felder) und echte Fehler (tatsächlich null-Werte, auf die zugegriffen wird). Unterscheiden Sie diese Fälle, bevor Sie etwas unterdrücken.
// 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!
}Konstruktorwarnung CS8618 beheben
CS8618 tritt auf, wenn eine nicht nullbare Eigenschaft im Konstruktor nicht gesetzt wird. Die bevorzugte Lösung besteht darin, ihren Wert im Konstruktor zu verlangen. Verwenden Sie = null! nur für Werte, die von einem Framework gesetzt werden.
// 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;
}
}Umgang mit Legacy-APIs
Drittanbieter- oder Legacy-APIs sind möglicherweise nicht annotiert. Ihre Rückgabetypen sind oblivious (weder nullable noch non-nullable). Weisen Sie ihre Ergebnisse nullable Variablen zu, um dies ausdrücklich zu machen.
// 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 versionsBestimmte Warnungen mit #pragma unterdrücken
Wenn eine Warnung tatsächlich ein Fehlalarm ist und = null! zu unübersichtlich wirkt, verwenden Sie #pragma warning disable, beschränkt auf die betreffende Zeile.
// 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-Warnungen als Fehler behandeln
Sobald alle Warnungen in einer Datei behoben sind, fügen Sie <WarningsAsErrors>Nullable</WarningsAsErrors> hinzu (oder setzen Sie eine Prüfung in der CI ein), um Regressionen zu verhindern – jedes neue Nullable-Problem lässt den Build fehlschlagen.
<!-- After full migration: treat nullable warnings as build errors -->
<PropertyGroup>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<!-- Or selectively: -->
<!-- <WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors> -->
</PropertyGroup>Öffentliche APIs annotieren
Wenn andere Ihre Bibliothek verwenden, werden NRT-Annotationen zu einem Bestandteil des Vertrags Ihrer öffentlichen API. Geben Sie T? zurück, wenn das Ergebnis null sein kann, und T, wenn dies garantiert ist.
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);
}Migrationsmetriken und Fortschrittsverfolgung
Verfolgen Sie den Fortschritt, indem Sie Dateien mit #nullable enable zählen oder in der CI dotnet build 2>&1 | grep CS86 ausführen. Legen Sie ein Zieldatum für die vollständige Migration des Projekts fest.
# 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 sprintSchnelltest
Was bedeutet die Zuweisung = null! an eine nicht nullbare Eigenschaft?
Zusammenfassung: Migration zu NRT
Wichtige Erkenntnisse:
- Verwenden Sie eine schrittweise Migration: Warnungsmodus → Aktivierung pro Datei → globale Aktivierung
- Unterscheiden Sie echte Fehler (beheben) von ORM-/DI-Mustern (verwenden Sie
= null!) - Beheben Sie CS8618, indem Sie Werte im Konstruktor verlangen, statt die Warnung zu unterdrücken
- Weisen Sie Ergebnisse von Legacy-APIs
T?-Variablen zu, um den möglichen Nullwert ausdrücklich zu machen - Behandeln Sie Nullable-Warnungen in der CI als Fehler, um Regressionen zu verhindern
- Annotierte öffentliche APIs werden zu eindeutigen Verträgen für ihre Nutzer
Häufig gestellte Fragen
Ist die Lektion „Eine Codebasis auf NRT migrieren“ kostenlos?
Ja — der vollständige Text von „Eine Codebasis auf NRT migrieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Eine Codebasis auf NRT migrieren“?
Wenden Sie eine schrittweise Migrationsstrategie an: Aktivieren Sie Warnungen, annotieren Sie APIs, beheben Sie Probleme und vermeiden Sie Fehlalarme. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Eine Codebasis auf NRT migrieren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- NRT aktivieren und verstehen
- Annotationen: ?, !, MaybeNull und NotNull
- Null-bedingte und Null-Koaleszenz-Operatoren
- Eine Codebasis auf NRT migrieren