kifejezés neve (C# hivatkozás)
Egy nameof
kifejezés egy változó, típus vagy tag nevét állítja elő sztringállandóként. A nameof
kifejezés fordításkor lesz kiértékelve, és futásidőben nincs hatása. Ha az operandus típus vagy névtér, a létrehozott név nem teljes értékű. Az alábbi példa egy nameof
kifejezés használatát mutatja be:
Console.WriteLine(nameof(System.Collections.Generic)); // output: Generic
Console.WriteLine(nameof(List<int>)); // output: List
Console.WriteLine(nameof(List<int>.Count)); // output: Count
Console.WriteLine(nameof(List<int>.Add)); // output: Add
List<int> numbers = new List<int>() { 1, 2, 3 };
Console.WriteLine(nameof(numbers)); // output: numbers
Console.WriteLine(nameof(numbers.Count)); // output: Count
Console.WriteLine(nameof(numbers.Add)); // output: Add
Egy kifejezéssel nameof
karbantarthatóbbá teheti az argumentum-ellenőrző kódot:
public string Name
{
get => name;
set => name = value ?? throw new ArgumentNullException(nameof(value), $"{nameof(Name)} cannot be null");
}
A C# 11-től kezdve használhat egy nameof
metódus vagy paraméter attribútumán belüli metódusparaméterrel rendelkező kifejezést. Az alábbi kód bemutatja, hogyan lehet ezt megtenni egy metóduson, egy helyi függvényen és egy lambdakifejezés paraméterén:
[ParameterString(nameof(msg))]
public static void Method(string msg)
{
[ParameterString(nameof(T))]
void LocalFunction<T>(T param) { }
var lambdaExpression = ([ParameterString(nameof(aNumber))] int aNumber) => aNumber.ToString();
}
A nameof
paraméterrel rendelkező kifejezések akkor hasznosak, ha a null értékű elemzési attribútumokat vagy a CallerArgumentExpression attribútumot használja.
Ha az operandus szó szerinti azonosító, a @
karakter nem része a névnek, ahogy az alábbi példa is mutatja:
var @new = 5;
Console.WriteLine(nameof(@new)); // output: new
C# nyelvspecifikáció
További információ: A C# nyelv specifikációjának Névkifejezések szakasza és a C# 11 – Kiterjesztett nameof
hatókörű funkció specifikációja.