nameof()-Operator in C# 6.0

Der neue C#-Operator nameof() bringt Typsicherheit in allen Fällen, wo bisher der Name eines Typs, eines Klassenmitglieds, eines Namensraums oder einer Variablen als Zeichenkette zu verwenden war.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 2 Min.
Von
  • Dr. Holger Schwichtenberg

Der neue C#-Operator nameof() bringt Typsicherheit in allen Fällen, wo bisher der Name eines Typs, eines Klassenmitglieds, eines Namensraums oder einer Variablen als Zeichenkette zu verwenden war.

In Visual Studio 14 CTP 3 findet man auch die aktuellen Prototypen der kommenden Features von C# 6.0. Kürzlich ergänzt hat Microsoft den Operator nameof(x), der den Namen des Operanden x liefert. Erlaubt als Operand x sind:

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

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)

Sehr sinnvoll ist dieses Feature für Dependency-Property-Deklarationen, PropertyChanged-Ereignisse, ArgumentNull-Fehler und alle anderen Situationen, wo man im Programmcode bisher eine Zeichenkette angeben musste. In allen diesen Fällen bringt der nameof()-Operator nun Typsicherheit und Refactoring-Unterstützung.

Beispiel 1:

// alt (vor C# 6.0)
if (kunde == null) throw new ArgumentNullException("kunde");

// C# 6.0
if (kunde == null) throw new ArgumentNullException(nameof(kunde));

Beispiel 2:

// alt (vor C# 6.0)
public static readonly DependencyProperty OrtProperty =
DependencyProperty.Register("Ort", typeof(string),
typeof(Kunde));

// C# 6.0
public static readonly DependencyProperty LandProperty =
DependencyProperty.Register(nameof(Land), typeof(string),
typeof(Kunde));

Dieses Feature hatte die Nutzergemeinde immer wieder gefordert, z.B. hier, hier und hier. Während Microsoft in der Vergangenheit die Implementierung immer abgelehnt hat (Begründung: "keep the number of new langauge features at a manageable level"), hat Microsoft nun nachgegeben, zumal die neue .NET Compiler Platform "Roslyn" die Implementierung neuer Sprachfeatures vereinfacht. Details zu nameof() findet man in den Design Meeting Notes des C#-Teams vom 9. Juli 2014.

Noch ist C# 6.0 eine Vorabversion. Einen konkreten Erscheinungstermin gibt es noch nicht. Eine Möglichkeit wäre, dass es im kommenden Jahr ein .NET Framework 5.0 mit einem Visual Studio 2015 gibt. ()