Tipps und Tricks rund um .NET und Visual Studio

Null-Conditional Operator in C# 6.0 und Visual Basic 14
Kommentare

Dr. Holger Schwichtenberg (MVP) teilt in der Kolumne „.NETversum“ sein Expertenwissen rund um .NET-Tools und WPF mit. Im heutigen Teil der Kolumne lesen Sie, wie Sie den Null-Conditional Operator in C# 6.0 und Visual Basic 14 verwenden.

Der Null-Conditional Operator gehört zu den syntakischen Zuckerstücken in C# 6.0 und Visual Basic 14.

Motivation

Die NullReferenceException gehört sicherlich zu den häufigsten Laufzeitfehlern, die man als Entwickler in .NET sieht – und fast immer ist man dafür selbst verantwortlich. So zu programmieren, kann man als „naiv“ bezeichnen:

var name0 = repository.GetKunde(1).Name.ToUpper();

Denn in diesem Fall könnte

  • Die Variable repository den Wert null haben und/oder
  • Die Methode GetKunde() könnte null liefern und/oder
  • Die Zeichenketteneigenschaft Name könnte null enthalten.

Robuster programmiert, sieht der obige Programmcode folgendermaßen aus:

string name1 = "";
  if (repository != null)
  {
    var kunde = repository.GetKunde(1);
    if (kunde != null)
    {
      if (kunde.Name != null)
      {
        name1 = kunde.Name.ToUpper();
      }
    }
  }

Alle drei oben genannten Fehlerfälle sind damit abgefangen. Der Programmcode ist aber nun deutlich länger geworden. Etwas prägnanter kann man unter Einsatz der Operatoren ? und ?? den Programmcode folgendermaßen schreiben:

string name2 = "";
if (repository != null)
{
  var kunde = repository.GetKunde(1);
  name2 = (((kunde == null) ? "" : kunde.Name) ?? "").ToUpper();
}

Tipp

Der Operator ?? (Null-Coalescing Operator) wurde in C# 2.0 im Jahr 2005 eingeführt. Er besteht aus zwei Operanden. Wenn der linke Operand nicht den Wert null hat, ist das Ergebnis der Operation der Wert des linken Operanden. Wenn der linke Operand den Wert null hat, ist das Ergebnis der Operation der Wert des rechten Operanden.

Der neue Null-Conditional Operator

Nun in C# 6.0 und auch in Visual Basic 14 kann man das Folgende schreiben – ohne Gefahr zu laufen, eine NullReferenceException zu bekommen:

string name3 = (repository?.GetKunde(1)?.Name ?? "").ToUpper();

Der Null-Conditional Operator (alias Null-Propagating Operator) liefert null als Ergebnis des Gesamtausdrucks, wenn das vor dem Operator bestehende Objekt null enthält. Der C# 6.0-Compiler macht daraus dann wieder eine Reihe von Fallunterscheidungen:

string arg_D3_0;
  if (repository == null)
  {
    arg_D3_0 = null;
  }
  else
  {
    Kunde expr_C7 = repository.GetKunde(1);
    arg_D3_0 = ((expr_C7 != null) ? expr_C7.Name : null);
  }
  string text = (arg_D3_0 ?? "").ToUpper();

Null-Conditional Operator und Ereignisse

Mit dem Null-Conditional Operator kann man z. B. auch das Auslösen von Ereignissen kürzer schreiben. Allerdings ist bei der neuen Variante explizit Invoke() aufzurufen.

Alt:

var handler = this.PropertyChanged 
if (handler!= null) handler(this, new PropertyChangedEventArgs(propertyName));

Neu:

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

Der C# 6.0-Compiler macht aus dem neuen Ausdruck:

PropertyChangedEventHandler expr_28 = this.PropertyChanged;
  if (expr_28 != null)
  {
    expr_28(this, new PropertyChangedEventArgs("MitarbeiterAnzahl"));
  }

Null-Conditional Operator und Indexer

Der Null-Conditional Operator kann auch beim Zugriff auf Indexer eingesetzt werden. Allerdings fängt der Null-Conditional Operator lediglich den Fall ab, dass die Listenvariable den Wert null hat. Es gibt weiterhin einen Laufzeitfehler (ArgumentOutOfRangeException), falls es das angesprochene Element in der Liste nicht gibt.

string kundenname = kundenListe?[123]?.GanzerName;

Operator „nameof“ in C# 6.0 und Visual Basic 14

Dieses Sprachfeature hatte die .NET-Nutzergemeinde immer wieder gefordert: Der neue Operator nameof liefert den Namen eines Bezeichners als Zeichenkette. Dabei wird von nameof() immer nur der relative Name geliefert. Übergeordnete Namensräume bzw. Typnamen bleiben unberücksichtigt:

Console.WriteLine(nameof(Kunde)); // Liefert Kunde für die Klasse Kunde
Console.WriteLine(nameof(kunde)); // Liefert kunde für die Variable kunde
Console.WriteLine(nameof(Kunde.Ort)); // Liefert Ort
Console.WriteLine(nameof(Kunde.ToString)); // Liefert ToString
Console.WriteLine(nameof(List)); // Liefert List
Console.WriteLine(nameof(ITVisions.Demo)); // liefert Demo (Namensraum)

Erlaubt als Operand von nameof() sind:

  • Typnamen
  • Namensräume
  • Lokale Variablen
  • Parameter
  • Klassenmitglieder
  • Typparameter

Dieser neue Operator erhöht die Robustheit und erleichtert das Refactoring in Situationen, in denen der Name einer Klasse oder eines Klassenmitglieds als Zeichenkette zu übergeben ist, z. B. ArgumentNullException, Dependency Properties und PropertyChangedEventArgs.

Beispiel 1: Einsatz für ArgumentNullException

Alt:

public void SaveKunde(Kunde kunde)
{
  if (kunde == null) throw new ArgumentNullException("kunde"));
  // ...
}

Neu:

public void SaveKunde(Kunde kunde)
{
  if (kunde == null) throw new ArgumentNullException(nameof(kunde));
  // ...
}

Beispiel 2: Einsatz für PropertyChangedEventArgs

Alt:

  public int MitarbeiterAnzahl
{
  get { return mitarbeiterAnzahl; }
  set
  {

    var handler = this.PropertyChanged;
    if (handler != null) handler(this, new PropertyChangedEventArgs("MitarbeiterAnzahl"));

    mitarbeiterAnzahl = value;
  }
}

Neu:

  public int MitarbeiterAnzahl
{
  get { return mitarbeiterAnzahl; }
  set
  {
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MitarbeiterAnzahl)));
    mitarbeiterAnzahl = value;
  }
}

Beispiel 3: Einsatz für Dependency Properties

Alt:

public static readonly DependencyProperty OrtProperty = 
  DependencyProperty.Register("Ort", typeof(string), typeof(Kunde));

Neu:

public static readonly DependencyProperty OrtProperty =
  DependencyProperty.Register(nameof(Ort), typeof(string), typeof(Kunde));

Buchempfehlungdotnet_praxis

In den vergangenen Jahren haben Dr. Holger Schwichtenberg und Manfred Steyer im „Windows Developer“ regelmäßig Tipps und Tricks aus ihrem Alltag als Softwareentwickler, Berater und Trainer für .NET- und webbasierte Anwendungen veröffentlicht. Das vorliegende Buch ist eine aktualisierte und deutlich erweiterte Zusammenfassung dieser Tipps und Tricks. Es umfasst sowohl das .NET Framework und seine zahlreichen Teilbibliotheken als auch die beliebte JavaScript-Bibliothek AngularJS sowie die Entwicklungsumgebung Visual Studio und ergänzende Werkzeuge.

Mehr Infos: www.entwickler-press.de/Dotnet-Praxis

Windows Developer

Windows DeveloperDieser Artikel ist im Windows Developer erschienen. Windows Developer informiert umfassend und herstellerneutral über neue Trends und Möglichkeiten der Software- und Systementwicklung rund um Microsoft-Technologien.

Natürlich können Sie den Windows Developer über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist der Windows Developer ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -