espressione nameof (riferimenti per C#)

Un'espressione nameof produce il nome di una variabile, un tipo o un membro come costante della stringa. Un’espressione nameof viene valutata in fase di compilazione e non ha alcun effetto in fase di esecuzione. Quando l'operando è un tipo o uno spazio dei nomi, il nome prodotto non è completo. L'esempio seguente illustra l'uso di un'espressione nameof:

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

È possibile usare l'espressione nameof per rendere più gestibile il codice per il controllo degli argomenti:

public string Name
{
    get => name;
    set => name = value ?? throw new ArgumentNullException(nameof(value), $"{nameof(Name)} cannot be null");
}

A partire da C# 11, è possibile usare un'espressione nameof con un parametro del metodo all'interno di un attributo in un metodo o nel relativo parametro. Il codice seguente illustra come eseguire questa operazione per un attributo in un metodo, una funzione locale e il parametro di un'espressione lambda:

[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();
}

Un'espressione nameof con un parametro è utile quando si usano gli attributi di analisi nullable o l'attributo CallerArgumentExpression.

Quando l'operando è un identificatore verbatim, il carattere @ non è la parte di un nome, come illustrato nell'esempio seguente:

var @new = 5;
Console.WriteLine(nameof(@new));  // output: new

Specifiche del linguaggio C#

Per altre informazioni, vedere la sezioneEspressioni Nameof della specifica del linguaggio C# e la specifica della funzionalità di ambito esteso C# 11nameof.

Vedi anche