expressão nameof (referência do C#)

A expressão nameof produz o nome de uma variável, de um tipo ou membro como a constante de cadeia de caracteres. A expressão nameof é avaliada em tempo de compilação e não tem efeitos em tempo de execução. Quando o operando é um tipo ou um namespace, o nome produzido não é totalmente qualificado. O seguinte exemplo mostra o uso de uma expressão 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

Você pode usar uma expressão nameof para tornar o código de verificação de argumentos mais passível de manutenção:

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

A partir do C# 11, você pode usar uma expressão nameof com um parâmetro de método dentro de um atributo em um método ou seu parâmetro. O código a seguir mostra como fazer isso para um atributo em um método, uma função local e o parâmetro de uma expressão 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();
}

Uma expressão nameof com um parâmetro é útil quando você usa os atributos de análise anuláveis ou o atributo CallerArgumentExpression.

Quando o operando é um identificador verbatim, o caractere @ não faz parte de um nome, como mostra o seguinte exemplo:

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

Especificação da linguagem C#

Para obter mais informações, confira a seção Expressões Nameof da Especificação da linguagem C# e a especificação do recurso C# 11 – Escoponameof estendido.

Confira também