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.

(Bild: Shutterstock.com/calimedia)
- 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 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:
(Bild:Â Screenshot (von Holger Schwichtenberg))
(rme)