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.

Il riferimento al linguaggio C# documenta la versione rilasciata più di recente del linguaggio C#. Contiene anche la documentazione iniziale per le funzionalità nelle versioni di anteprima pubblica per la prossima versione del linguaggio di programmazione.

La documentazione identifica tutte le funzionalità introdotte nelle ultime tre versioni della lingua o nelle anteprime pubbliche correnti.

Suggerimento

Per trovare quando una funzionalità è stata introdotta per la prima volta in C#, vedere l'articolo sulla cronologia delle versioni del linguaggio C#.

L'esempio seguente illustra come usare un'espressione nameof :

Console.WriteLine(nameof(System.Collections.Generic));  // output: Generic
Console.WriteLine(nameof(List<int>));  // output: List
Console.WriteLine(nameof(List<>)); // 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

L'esempio precedente che usa List<> è supportato in C# 14 e versioni successive. L'operando di nameof può essere un tipo generico non associato, ad esempio List<> o Dictionary<,>. Il risultato è il nome del tipo semplice senza arity o un elenco di argomenti di tipo , che nameof(List<>) restituisce "List". Gli operandi generici non associati sono utili per la registrazione, i messaggi di diagnostica e gli argomenti di attributo in cui il nome del tipo generico è importante, ma gli argomenti di tipo non lo sono.

È 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");
}

È 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 fa parte del nome, come illustrato nell'esempio seguente:

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

Specifiche del linguaggio C#

Per altre informazioni, vedere la sezione Espressioni Nameof della specifica del linguaggio C#.

Vedi anche