Sie sind hier: Weblog

nameof()-Operator in C# 6.0

Foto Dr. Holger Schwichtenberg, Dr. Holger Schwichtenberg
16.09.2014 12:06:00

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. ()