Wer kennt es nicht, das ständige Prüfen auf null
bevor auf Eigenschaften zugegriffen oder Methoden ausgeführt werden. Damit wollen wir eine NullReferenceException
möglichst vermeiden. Diese Prüfungen sehen etwa wie folgt aus:
Person firstPerson = null;
var newAddress = new Address();
if (firstPerson != null)
{
firstPerson.Relocate(newAddress);
}
Weit schlimmer sieht das bei komplexeren Objektbäumen/Datenstrukturen aus. Mit C# 6.0 bietet mit dem null-conditional Operator eine Vereinfachung:
Person firstPerson = null;
var newAddress = new Address();
firstPerson?.Relocate(newAddress);
Mit ?.
wird der Zugriff nur ausgeführt, wenn die Variable auf ein Objekt zeigt. Das funktioniert mittels ?[
allerdings auch für Index-Operationen:
var street = firstPerson?.Addresses?[0]?.Street;
Das sieht doch weit besser aus als:
string street;
if (firstPerson != null
&& firstPerson.Addresses != null
&& firstPerson.Addresses.Count > 0)
{
if (firstPerson.Addresses[0] != null)
{
street = firstPerson.Addresses[0].Street;
}
}
Oder nicht?
Der Einsatz bei Delegates/Events klappt ebenfalls wunderbar (thread-sicher):
public delegate void ChangeAddress(Address address);
...
public event ChangeAddress AddressChanged;
...
public void Relocate(Address address)
{
PhysicalAddress = address;
AddressChanged?.Invoke(address);
}
Die bisherige Variante im Vergleich dazu:
var changed = AddressChanged;
if (changed != null)
{
changed(address);
}
Viel Spaß damit :)
Viele weitere Neuerungen finden sich in der C# 6 Serie.
Vielen Dank für diesen Beitrag.
Die Erklärung war sehr ausführlich und trotzdem stand in diesem Beitrag nicht zuviel Text.
Auch durch die Beispiele war der Code einfacher zu verstehen.