Der Null-coalescing Operator oder ??

Heute bin ich über eine Kleinigkeit gestolpert die zwar seit .NET 2.0 existiert mir aber irgend wie nie zuvor über den Weg gelaufen ist: Der ?? Operator.

Sicher bekannt ist jedem der ? Operator, der sich in etwa wie eine if-else Anweisung verhält:

If-else:

if(x == null)
   return y;
else
   return x;

? Operator:

 return x == null ? y : x;

Der ?? Operator wird auch coalescing operator genannt und ist nicht etwa ein Schreibfehler von mir sondern eine Spezialisierung des conditional Operators „?“. Er prüft ob der linke Operant null ist und gibt diesen zurück wenn dem nicht so ist, ansonsten wird der rechte Operant ausgeführt und zurück gegeben. Häufig wird dies mit nullable Datentypen verwendet oder um Lazy Initialization zu realisieren.

Entsprechendes Beispiel zu oben:

return x ?? y;

bzw. Lazy Instantiation:

public object MyObject()
{
   get
   {
        // Don't forget the parenthesis
        return _myObject ?? (_myObject = new object());
    }
}

Wichtig sind hier vorallem zwei Dinge: Der Operator stellt keine atomare Operation dar, er ist also nicht threadsicher! Zweitens muss das Resultat des rechten Operanten den gleichen Datentyp haben wie der linke. Dem kann man sich im schlimmsten Fall mit einem Cast behelfen.

string s = (string)_myObject : "das Objekt ist null!";

Aufpassen sollte man weiterhin bei der Reihenfolge in Verbindung mit anderen Operatoren. So kommt vorallem bei Stringoperationen gern zu Problemen, denn ?? kommt in der Auswertungsreihenfolge sehr weit hinten und sollte deshalb besser mit Klammerung verwendet werden. Ein gutes Beispiel gibt es bei Stackoverflow.