Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
intoderboolauchnullgehalten 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 seinnull; der Compiler warnt, wenn Sie ihn ableiten, ohne zuerst zu überprüfen. -
string— dieser Verweis sollte nicht seinnull; der Compiler warnt, wenn Sie ihn zuweisennull.
// 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 beispielsweiseint?für eine optionale Datenbankspalte oderDateTime?für ein Ereignis, das noch nicht geplant ist. - Verwenden Sie
string?und andere nullbare Verweisanmerkungen, um zu dokumentieren, dass ein Verweis sein kannnull, sodass der Compiler Sie warnen kann, bevor einNullReferenceExceptionauftritt.
Zusammen bieten ihnen diese Features und die Nulloperatoren einen vollständigen Satz von Tools zum Schreiben von nullsicherem C#-Code.