0Pricing
C# Academy · Lektion

NRT aktivieren und verstehen

Aktivieren Sie den Nullable-Kontext, verstehen Sie nullable und nicht-nullable Referenztypen und lesen Sie Compilerwarnungen.

NRT aktivieren und verstehen ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 1 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.

Der Milliarden-Dollar-Fehler

Tony Hoare, der Erfinder von null, bezeichnete es als seinen „Milliarden-Dollar-Fehler“. In C# konnte jeder Referenztyp standardmäßig null sein, wodurch NullReferenceException zum häufigsten Laufzeitabsturz wurde. Nullable Reference Types (NRT) beheben dieses Problem auf Ebene des Compilers.

Den Nullable-Kontext aktivieren

Aktivieren Sie NRT global in Ihrer Projektdatei oder dateiweise mit Direktiven. Nach der Aktivierung behandelt der Compiler Referenztypen standardmäßig als nicht-nullbar.

<!-- In .csproj — enable for the whole project -->
<PropertyGroup>
  <Nullable>enable</Nullable>
</PropertyGroup>

// Or per-file:
#nullable enable
// ... code with NRT warnings
#nullable disable
// ... code without NRT warnings

Nicht-nullbare und nullable Referenztypen

Bei aktiviertem NRT bedeutet string, dass der Wert niemals null ist, während string? bedeutet, dass er null sein kann. Der Compiler warnt, wenn Sie null einem nicht-nullbaren Typ zuweisen oder einen nullable Wert ohne Prüfung dereferenzieren.

#nullable enable

string nonNull = "Hello";    // OK
string? maybeNull = null;    // OK — explicitly nullable

nonNull = null;              // WARNING: CS8600
Console.WriteLine(maybeNull.Length); // WARNING: CS8602 — may be null

// Fix:
if (maybeNull is not null)
    Console.WriteLine(maybeNull.Length); // safe

Datenflussanalyse

Der Compiler führt eine Datenflussanalyse durch — er verfolgt den Nullzustand durch Bedingungen und Verzweigungen und unterdrückt Warnungen, wenn er beweisen kann, dass ein Wert nicht null ist.

string? name = GetName();

// After null check, name is treated as non-null:
if (name is not null)
    Console.WriteLine(name.Length);  // no warning

// Same with early return:
if (name is null) return;
Console.WriteLine(name.Length);     // no warning — null was returned

// Pattern matching:
if (name is string s)
    Console.WriteLine(s.ToUpper()); // no warning

Nullable-Warnungen: CS8600–CS8629

Wichtige NRT-Warnungen, die Sie verstehen sollten: CS8600 (Zuweisung von null an einen nicht-nullbaren Typ), CS8602 (Dereferenzierung eines möglicherweise nullbaren Werts), CS8603 (Rückgabe von null für einen nicht-nullbaren Typ), CS8618 (nicht initialisiertes nicht-nullbares Feld).

#nullable enable

public class Order
{
    public string CustomerName { get; set; } // CS8618: not initialized
    public string? TrackingNumber { get; set; } // OK — nullable

    public Order(string name)
    {
        CustomerName = name; // now initialized — CS8618 gone
    }
}

string? s = GetValue();
Console.WriteLine(s.Length); // CS8602: s might be null

Nicht-nullbare Felder initialisieren

CS8618 wird ausgelöst, wenn ein nicht-nullbares Feld oder eine nicht-nullbare Eigenschaft im Konstruktor nicht gesetzt wird. Mögliche Lösungen: Initialisierung in der Deklaration, Erzwingen der Initialisierung über den Konstruktor oder Verwendung des Nullverzeihungsoperators für DI-/ORM-Muster.

// Option 1: Initialize in declaration
public string Name { get; set; } = "";

// Option 2: Require via constructor
public class Product
{
    public string Name { get; }
    public Product(string name) => Name = name;
}

// Option 3: null-forgiving for ORM entities
public string Name { get; set; } = null!;
// null! tells compiler "trust me, this will be set by EF Core"

Nullable in generischen Typen

Generische Typparameter können auf nicht-nullbare Typen beschränkt werden. Eine where T : notnull-Einschränkung stellt sicher, dass T niemals null sein kann.

// Without constraint: T could be nullable
public T? Find<T>(int id) { ... }

// With notnull: T must be a non-nullable type
public T FindRequired<T>(int id) where T : notnull
{
    var result = InternalFind<T>(id);
    return result ?? throw new KeyNotFoundException();
}

// T? is meaningful only when T is known to be non-nullable
public T? FindOrDefault<T>(int id) where T : class { ... }

Nullable in Interfaces und Überschreibungen

Beim Implementieren eines Interfaces oder Überschreiben einer Methode müssen die Nullbarkeitsannotationen übereinstimmen. Der Compiler prüft, dass Implementierungen mindestens genauso nicht-nullbar sind, wie es das Interface vorgibt.

public interface IRepository<T>
{
    T? FindById(int id);       // may return null
    T GetOrThrow(int id);      // never null
}

// Implementation:
public class ProductRepo : IRepository<Product>
{
    public Product? FindById(int id)  => _db.Find(id);
    public Product  GetOrThrow(int id) =>
        _db.Find(id) ?? throw new KeyNotFoundException();
}

Nullable-Werttypen und nullable Referenztypen

Verwechseln Sie int? (Nullable<int> — ein Wrapper für einen Werttyp, der bereits vor C# 8 existierte) nicht mit string? (NRT-Annotation — nur zur Compilezeit, ohne zusätzlichen Laufzeitaufwand).

// Nullable value type (runtime Nullable<int>)
int? age = null;
bool hasValue = age.HasValue;
int value  = age.GetValueOrDefault();

// Nullable reference type (compile-time annotation only)
string? name = null;
// string? has NO runtime wrapper — it's just a compile-time hint
// null check is still needed at runtime
if (name is not null)
    Console.WriteLine(name.ToUpper());

Warnungen mit ! unterdrücken

Der Nullverzeihungsoperator (!) unterdrückt eine bestimmte Nullable-Warnung, wenn Sie es besser wissen als der Compiler. Verwenden Sie ihn sparsam und dokumentieren Sie, warum er sicher ist.

// Use ! when you know the value cannot be null
var user = _db.Users.FirstOrDefault(u => u.Email == email);
var name = user!.Name; // user is guaranteed by business logic

// EF Core navigation properties set by the framework:
public class Order
{
    public Customer Customer { get; set; } = null!; // set by EF Core
}

Praxisbeispiel: Nullable API-Antwort

Ein API-Wrapper, bei dem Felder in der JSON-Antwort vorhanden sein können oder nicht — nullable Annotationen vermitteln die beabsichtigte Verwendung eindeutig.

#nullable enable

public class WeatherResponse
{
    public string City { get; set; } = "";     // always present
    public double Temperature { get; set; }     // always present
    public string? Description { get; set; }    // optional field
    public string? AlertMessage { get; set; }   // only when there's an alert
}

// Consumer:
var weather = await api.GetWeatherAsync("London");
Console.WriteLine(weather.City);            // safe
Console.WriteLine(weather.Description?.ToUpper() ?? "N/A"); // safe null-handling

Schnelltest

Welchen Laufzeitaufwand haben Nullable Reference Types (string?) im Vergleich zu regulären Referenztypen (string)?

Rückblick: NRT aktivieren und verstehen

Die wichtigsten Erkenntnisse:

  • Global mit <Nullable>enable</Nullable> in .csproj aktivieren
  • string = niemals null; string? = kann null sein
  • Die Datenflussanalyse verfolgt den Nullzustand durch Verzweigungen und Rückgaben
  • NRT-Annotationen gelten nur zur Compilezeit — kein Laufzeitaufwand
  • CS8618: nicht-nullbare Felder im Konstruktor initialisieren oder = null! für ORM verwenden
  • ! sparsam verwenden — dokumentieren Sie, warum die Nullverzeihung sicher ist

Häufig gestellte Fragen

Ist die Lektion „NRT aktivieren und verstehen“ kostenlos?

Ja — der vollständige Text von „NRT aktivieren und verstehen“ 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 „NRT aktivieren und verstehen“?

Aktivieren Sie den Nullable-Kontext, verstehen Sie nullable und nicht-nullable Referenztypen und lesen Sie Compilerwarnungen. 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 1 von 4.

Wie lange dauert die Lektion „NRT aktivieren und verstehen“?

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