Udostępnij za pośrednictwem


nameof expression (odwołanie w C#)

Wyrażenie nameof tworzy nazwę zmiennej, typu lub elementu członkowskiego jako stałej ciągu. Wyrażenie nameof jest oceniane w czasie kompilacji i nie ma żadnego efektu w czasie wykonywania. Gdy operand jest typem lub przestrzenią nazw, utworzona nazwa nie jest w pełni kwalifikowana. W poniższym przykładzie pokazano użycie nameof wyrażenia:

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

Możesz użyć nameof wyrażenia, aby kod sprawdzania argumentów był bardziej konserwowalny:

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

Począwszy od języka C# 11, można użyć nameof wyrażenia z parametrem metody wewnątrz atrybutu w metodzie lub jego parametrze. Poniższy kod pokazuje, jak to zrobić dla atrybutu w metodzie, funkcji lokalnej i parametru wyrażenia 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();
}

Wyrażenie nameof z parametrem jest przydatne w przypadku używania atrybutów analizy dopuszczalnej wartości null lub atrybutu CallerArgumentExpression.

Gdy operand jest identyfikatorem dosłownym, @ znak nie jest częścią nazwy, jak pokazano w poniższym przykładzie:

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

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz sekcję Nameof expressions ( Wyrażenia nazw) specyfikacji języka C# oraz specyfikację funkcji C# 11 — Extended scope (Rozszerzony nameof zakres ).

Zobacz też