C# 6.0: Null-conditional Operator (?.)

C# ist eine sehr mächtige Sprache und in der sechsten Version wurde einiges vereinfacht. In diesem Beitrag beschreibe ich den neuen Null-conditional Operator (?.) etwas genauer. In der objektorientierten Programmierung hat man Klassen, die diverse Eigenschaften zur Verfügung stellen. Bevor man jetzt auf die Eigenschaften dieser Klasse zugreifen kann muss sichergestellt sein, dass eine Instanz dieser Klasse existiert bzw. das entsprechende Objekt nicht NULL ist. Tut man dies nicht wird man eine NullReferenceException erhalten. Für diese Szenarien wurde in C# 6.0 der Null-conditional Operator (?.) eingeführt.

Die NullReferenceException ist eine Ausnahme, die fast immer darauf schließen lässt, dass man versucht auf eine Eigenschaft eines Objekt zuzugreifen das noch NULL ist bzw. noch nicht initialisiert wurde. Beispiel wäre z.B. die Längenprüfung eines Arrays oder einer Liste (hier muss zunächst geprüft werden, ob das entsprechende Objekt ungleich NULL ist). Den Operator kann man auch super für das Lesen von XML-Atrributen verwenden. Angenommen man hat die folgende XML-Datei:

In dieser XML-Datei werden Verbindungsdaten gespeichert. Wenn man jetzt auf diese Verbindungsdaten zugreifen möchte könnte man wie folgt vorgehen:

In Zeile 7 wird zunächst einmal geprüft ob das Attribute des XML-Knotens überhaupt existiert und einen Wert hat. Ist das der Fall wird der Wert verwendet, wenn nicht wird eine leerer String zugewiesen. Das könnte man jetzt mit der verkürzten if-Anweisung (var variable = condition ? A : B;) noch etwas kompakter schreiben:

Noch etwas kürzer geht es jetzt mit dem ?.-Operator. Dann sieht das ganze wie folgt aus:

In diesem Beispiel wird das Ganze noch mit dem ??-Operator kombiniert. Der Operator ?? wird NULL-Sammeloperator genannt. Der linke Operand wird zurückgegeben, falls dieser nicht NULL ist. Andernfalls wird der rechte Operand zurückgegeben. Also ein echte Vereinfachung wenn es um NULL-Prüfungen geht.

Hinweis: Zugriffe auf Array

Die Syntax ?[] entspricht der ?. Syntax, und zwar immer dann, wenn auf einen Indexer zugegriffen wird (z.B. ein Array oder eine Klasse, die einen Indexer implementiert). Das sieht dann wie folgt aus:

Fork me on GitHub