C#-Nullsicherheit

Tipp

Dieser Artikel ist Teil des Abschnitts "Grundlagen" für Entwickler, die bereits mindestens eine Programmiersprache kennen und C# erlernen. Wenn Sie noch nicht mit der Programmierung vertraut sind, beginnen Sie zuerst mit den Lernprogrammen " Erste Schritte ".

Kommen Sie von Java oder C++? C# bietet Compile-Time-Nullsicherheit durch nullable Referenztypen. Das Ziel ähnelt Java @NonNull Anmerkungen, wird jedoch vom Compiler erzwungen. C# verfügt auch über dedizierte Operatoren wie ?. und ??, die nullsichere Ausdrücke kurz und bündig machen.

null stellt das Fehlen eines Werts dar. Wenn Sie versuchen, auf ein Element für einen Verweis null durch Aufrufen einer Methode oder Lesen einer Eigenschaft zuzugreifen, löst die Laufzeit eine NullReferenceException aus:

// Accessing a member on null throws NullReferenceException at runtime:
// string? name = null;
// int length = name.Length; // throws NullReferenceException

// Check before you dereference:
string? name = null;
if (name is not null)
{
    Console.WriteLine($"Name has {name.Length} characters.");
}
else
{
    Console.WriteLine("Name has no value.");
}
// Output: Name has no value.

C# bietet Ihnen drei ergänzende Tools zum Schreiben von nullsicherem Code:

  • Nullbare Werttypen: Damit wird eine Werttyp wie int oder bool auch null gehalten werden.
  • Nullbare Verweistypen: Damit kann der Compiler nachverfolgen, ob möglicherweise ein Verweis vorliegt. null
  • Null-Operatoren: Drücken konzis den nullsicheren Zugriff und die Fallback-Logik aus

Nullable Werttypen

Werttypen wie z. B. int, double und bool können standardmäßig null nicht enthalten. Fügen Sie ? dem Typnamen hinzu, um einen Nullwerttyp zu erstellen, der entweder einen Wert enthält, oder null:

int? score = null;
Console.WriteLine(score.HasValue);               // False

score = 95;
Console.WriteLine(score.HasValue);               // True
Console.WriteLine(score.GetValueOrDefault());    // 95

int? missing = null;
Console.WriteLine(missing.GetValueOrDefault(-1)); // -1

Nullable-Werttypen sind nützlich, wenn ein zugrunde liegender Werttyp "keine Daten" darstellen muss. Häufige Szenarien umfassen Datenbankspalten, die möglicherweise nicht vorhanden sind, optionale Konfigurationseinstellungen und Sensorwerte, die noch nicht erfasst werden.

Alles zu Deklarations-, Überprüfungs- und Konvertierungstypen finden Sie unter Nullbare Werttypen.

Nullable Verweistypen

Referenztypen, wie string, Arrays und Klasseninstanzen, können zur Laufzeit null enthalten. Nullbare Verweistypen ist eine Compilerfunktion, die Null-Absichten explizit macht und Fehler zur Kompilierungszeit aufdeckt.

Mithilfe der ? Anmerkung deklarieren Sie Ihre Absicht:

  • string? — dieser Verweis kann sein null; der Compiler warnt, wenn Sie ihn ableiten, ohne zuerst zu überprüfen.
  • string — dieser Verweis sollte nicht sein null; der Compiler warnt, wenn Sie ihn zuweisen null .
// string?  means this reference might be null
// string   means this reference should not be null
string? nullableName = null;
string  nonNullName  = "Alice";

// ?. safely accesses a member when the reference might be null
string display = nullableName?.ToUpper() ?? "(no name)";
Console.WriteLine(display);         // (no name)

display = nonNullName.ToUpper();    // safe: nonNullName is never null
Console.WriteLine(display);         // ALICE

Alle .NET-Projekte, die mit modernen SDK-Vorlagen erstellt werden, aktivieren standardmäßig nullfähige Verweistypen. Vollständige Anweisungen zum Aktivieren und Kommentieren finden Sie unter Nullbare Verweistypen.

Null-Operatoren

C# enthält mehrere Operatoren, mit denen Sie nullsicheren Code ohne manuelle if-null-Schutzvorrichtungen überall schreiben können:

Operator Name Purpose
?. Null-bedingter Memberzugriff Zugriff auf ein Mitglied nur, wenn das Objekt nicht null ist
?[] Nullbedingter Indexerzugriff. Greifen Sie nur auf ein Element zu, wenn die Auflistung nicht null ist.
?? Null-Koalescing Zurückgeben eines Fallbackwerts, wenn der Ausdruck null
??= Nullkoalierende Zuweisung Nur zuweisen, wenn die Variable null ist
is null / is not null NULL-Muster Bevorzugter Nulltest
string? city = GetCity();

// ?. — access a member only when non-null
int? len = city?.Length;

// ?? — substitute a default when null
string display = city ?? "unknown";

// is null — preferred null test
if (city is null)
{
    Console.WriteLine("No city provided.");
}
else
{
    Console.WriteLine($"{display} ({len} chars)");
}
// Output: No city provided.

Ausführliche Beispiele für jeden Operator finden Sie unter Null-Operatoren.

Nullbare Werttypen und nullbare Verweistypen dienen unterschiedlichen Zwecken.

Nullable-Werttypen und nullable Verweistypen sind keine Alternativen. Sie lösen verschiedene Probleme:

  • Verwenden Sie T?, um einen Werttyp darzustellen, der "kein Wert" benötigt. Verwenden Sie beispielsweise int? für eine optionale Datenbankspalte oder DateTime? für ein Ereignis, das noch nicht geplant ist.
  • Verwenden Sie string? und andere nullbare Verweisanmerkungen, um zu dokumentieren, dass ein Verweis sein kann null, sodass der Compiler Sie warnen kann, bevor ein NullReferenceException auftritt.

Zusammen bieten ihnen diese Features und die Nulloperatoren einen vollständigen Satz von Tools zum Schreiben von nullsicherem C#-Code.