Neu in .NET 8.0 [8]: Verbesserungen für nameof() in C# 12.0

Der in C# 6.0 eingeführte Operator, der den Namen eines Bezeichners als String liefert, hatte bisher einige Einschränkungen, die in C# 12.0 entfallen.

In Pocket speichern vorlesen Druckansicht

(Bild: Shutterstock.com/calimedia)

Lesezeit: 1 Min.
Von
  • Dr. Holger Schwichtenberg

Der in C# 6.0 neu eingeführte Operator nameof() liefert den Namen eines Bezeichners als Zeichenkette (bei mehrgliederigen Namen nur den letzten Teil). Dieser 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.

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

Der Operator nameof() funktionierte vor C# 12.0 aber in manchen Situationen nicht. Der Abruf des Namens von Instanzmitgliedern von Klassenmitgliedern war nicht möglich in einigen Fällen (statische Mitglieder, Annotationen) vor C# 12.0. Microsoft hat den Einsatzbereich von C# 12.0 auf diese Fälle erweitert.

// nameof(Name.Length) nicht möglich vor C# 12.0!
[Description($"{nameof(StringLength)} liefert von {nameof(Name)} die Eigenschaft {nameof(Name.Length)}")] 
public struct Person
{
 public string Name;
 // bisher schon möglich:
 public string MemberName1() => nameof(Name);
 // bisher schon möglich:
 public string MemberName2() => nameof(Name.Length);
 // bisher schon möglich:
 public static string MemberName3() => nameof(Name);
 // bisher Fehler CS0120, da statisches Mitglied versucht 
 // auf Mitglied von Mitglied zuzugreifen
 public static string MemberName4() => nameof(Name.Length);
 
// nameof(Name.Length) war nicht möglich vor C# 12.0!
 [Description($"{nameof(StringLength)} liefert von {nameof(Name)} die Eigenschaft {nameof(Name.Length)}")] 

 public int StringLength()
 {
  return Name.Length;
 }
 
 public void PrintMemberInfo()
 {
  Console.WriteLine($"Die Struktur {nameof(Person)} hat ein "+ 
                    "Mitglied{nameof(Name)}, welches eine " + 
                    "Eigenschaft {nameof(Name.Length)} besitzt!"); 
 }
}

Hier wäre vor C# 12.0 der Ausdruck nameof(Name.Length) in drei der sechs oben gezeigten Fälle nicht möglich gewesen und vom Compiler mit dem Kompilierfehler "error CS0120: An object reference is required for the non-static field, method, or property 'Name.Length'" quittiert worden. Der folgende Screenshot zeigt mit roten Linien, was vor C# 12.0 nicht möglich war:

Unterstrichen sind vor C# 12.0 nicht mögliche Anwendungsfälle von nameof().

(Bild: Screenshot (von Holger Schwichtenberg))

(rme)