0Pricing
C# Academy · Lektion

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 unchecked

Warnungen 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 versions

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

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

Schnelltest

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

  1. NRT aktivieren und verstehen
  2. Annotationen: ?, !, MaybeNull und NotNull
  3. Null-bedingte und Null-Koaleszenz-Operatoren
  4. Eine Codebasis auf NRT migrieren
← Zurück zu C# Academy