C# 6.0: Der Operator nameof

Eine weitere neue Funktion in C# 6.0 ist der Operator „nameof“. Dies ist ein neues Schlüsselwort zum Identifizieren des Namens eines Typs, eines Klassenmitglieds, eines Namensraums oder einer Variablen als Zeichenkette. Dieser Operator kann überall da eingesetzt werden wo man bisher im Programmcode eine Zeichenkette angeben musste, z.B. für DependencyProperty-Deklarationen oder PropertyChanged-Ereignisse. Dafür gibt man dem nameof-Operator als Parameter einfach den Variablen- oder Eigenschaftsnamen mit und bekommt den entsprechenden Namen des Bezeichners als Zeichenliteral zurückgeliefert. Anhand einer einfachen Beispielimplementierung der INotifyPropertyChanged-Schnittstelle wird gezeigt wie man diesen Operator einsetzen kann.

In WPF-Anwendungen ist die INotifyPropertyChanged-Schnittstelle von zentraler Bedeutung. Diese Schnittstelle hilft bei der Benachrichtigung anderer Instanzen bzgl. veränderter Properties. Besonders in WPF hilft diese Schnittstelle bei der Trennung zwischen Logik und UI, da erst durch die Implementierung dieser Schnittstelle die Anzeige bei Änderungen aktualisiert wird. Dabei erwartet das PropertyChanged-Ereignis als Parameter den Namen der Eigenschaft, die sich geändert hat. Ein Aufruf sah bisher so aus:

Wie in Zeile 8 zu sehen wird hier der Name der Eigenschaft hartcodiert an das Event übergeben. Will man die Eigenschaft jetzt umbenennen muss diese Zeile ebenfalls geändert werden! Mit dem neuen nameof-Operator sieht das das wie folgt aus:

Hier kann man in Zeile 12 und 26 schön sehen, dass der Name der Eigenschaft nicht hartcodiert übergeben wird, sondern mit dem neuen nameof-Operator zur Kompilierungszeit ermittelt wird. Was gerade bei der Umbenennung von Eigenschaften ein riesiger Vorteil ist (wenn man über Visual Studio umbenennt werden nämlich auch alle Referenzen umbenannt).

Mit dem neuen ?.-Operator (siehe C# 6.0: Null-conditional Operator (?.)) kann das Ganze noch weiter vereinfacht werden:

Durch die Verwendung des nameof-Operators muss der Property-Name nun nicht mehr angegeben werden! Somit ist das Risiko von Verschreibern eliminiert und auch das Umbenennen von Eigenschaften ist kein Problem mehr! Somit ist der Code wartungsfreundlicher und “robuster”.

Übrigens ist die Verwendung des Attributs „CallerMemberName“ zum Abrufen eines Eigenschaftennamens für den PropertyChanged-Aufruf noch immer ein gültiges Verfahren zum Abrufen des Eigenschaftennamens (siehe .NET: Caller Info Attributes in C# 5.0).

Fork me on GitHub