In C# kennzeichnet das Literal null die Abwesenheit eines Werts. Ein Nullable-Typ ist ein Typ, der null-Werte zulässt.
Vor C# 8.0 konnten Referenztypen immer null sein, Werttypen nicht. Ein Werttyp wird nullable, wenn du ein Fragezeichen (?) anhängst.
string nullableReferenceType = "hello";
nullableReferenceType = null; // Valid as type is nullable
int nonNullableValueType = 5;
nonNullableValueType = null; // Compile error as type is not nullable
int? nullableValueType = 5; // Define nullable value type
nullableValueType = null; // Valid as type is nullable
Der Zugriff auf ein Member einer null-Variable verursacht keinen Kompilierfehler, löst aber zur Laufzeit eine NullReferenceException aus:
string sentence = null;
// Throws NullReferenceException at runtime
sentence.Length;
Um dieser häufigen Fehlerart entgegenzuwirken, kannst du in C# 8 ein Feature aktivieren, das Referenztypen standardmäßig nicht-nullable macht:
string nonNullableReferenceType = "book";
nonNullableReferenceType = null; // Compile warning (no error!)
string? nullableReferenceType = "movie";
nullableReferenceType = null; // Valid as type is nullable
Um sicher mit nullable Werten zu arbeiten, prüfe, ob sie null sind, bevor du sie verwendest:
string NormalizedName(string? name)
{
if (name == null)
{
return "UNKNOWN";
}
// Value is not null at this point, so no compile warning
// and no runtime NullReferenceException being thrown
return name.ToUpper();
}
NormalizedName(null); // => "UNKNOWN"
NormalizedName("Elisabeth"); // => "ELISABETH"
Mit dem Operator ?? kannst du einen Standardwert zurückgeben, wenn der Wert null ist:
string? name1 = "John";
name1 ?? "Paul"; // => "John"
string? name2 = null;
name2 ?? "George"; // => "George"
Mit dem Operator ?. kannst du Member sicher auf einem möglicherweise null-Wert aufrufen:
string? fruit = "apple";
fruit?.Length; // => 5
string? vegetable = null;
vegetable?.Length; // => null
In dieser Übung schreibst du Code, um Namensschilder für Fabrikangestellte zu drucken.
Angestellte haben eine ID, einen Namen und einen Abteilungsnamen. Die Beschriftung eines Namensschilds hat folgendes Format: "[id] - name - DEPARTMENT". Implementiere die (statische) Methode Badge.Print(), um die Beschriftung eines Namensschilds zurückzugeben:
Badge.Print(734, "Ernest Johnny Payne", "Strategic Communication");
// => "[734] - Ernest Johnny Payne - STRATEGIC COMMUNICATION"
Beachte, dass die Abteilung auf dem Schild in Großbuchstaben geschrieben werden muss.
Aufgrund einer Eigenheit im Computersystem haben neue Angestellte manchmal noch keine ID, wenn sie ihre Arbeit in der Fabrik beginnen. Da Namensschilder Pflicht sind, erhalten sie ein vorläufiges Namensschild ohne das ID-Präfix. Passe die (statische) Methode Badge.Print() an, damit sie neue Angestellte unterstützt, die noch keine ID haben:
Badge.Print(id: null, "Jane Johnson", "Procurement");
// => "Jane Johnson - PROCUREMENT"
Sogar der Besitzer der Fabrik muss jederzeit ein Namensschild tragen. Ein Besitzer hat jedoch keine Abteilung. In diesem Fall sollte das Schild "OWNER" anstelle des Abteilungsnamens anzeigen. Passe die (statische) Methode Badge.Print() an, um das Schild für den Besitzer auszugeben:
Badge.Print(254, "Charlotte Hale", department: null);
// => "[254] - Charlotte Hale - OWNER"
Beachte, dass der Besitzer gleichzeitig auch ein neuer Angestellter sein kann:
Badge.Print(id: null, "Charlotte Hale", department: null);
// => "Charlotte Hale - OWNER"
Melde dich bei Exercism an, um C# mit 62 Konzepte178 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.