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 warningsNicht-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); // safeDatenflussanalyse
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 warningNullable-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 nullNicht-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-handlingSchnelltest
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
- NRT aktivieren und verstehen
- Annotationen: ?, !, MaybeNull und NotNull
- Null-bedingte und Null-Koaleszenz-Operatoren
- Eine Codebasis auf NRT migrieren