nameof 運算式 (C# 參考)

nameof 運算式會將變數、型別或成員名稱產生為字串常數。 nameof 運算式會在編譯時間評估,在執行階段則不會有作用。 當運算元是型別或命名空間時,產生的名稱不完整。 下列範例將示範 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

您可以使用 nameof運算式,讓檢查引數的程式碼更容易維護:

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

從 C# 11 開始,您可以在方法或其參數的屬性內搭配方法參數使用 nameof 運算式。 下列程式碼會示範如何針對方法、區域函式和 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();
}

當您使用可為 Null 的分析屬性CallerArgumentExpression 屬性時,具有參數的 nameof 運算式非常有用。

當運算元是逐字識別碼時,@ 字元不是名稱的一部分,如下列範例所示:

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

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格Nameof 運算式一節,以及 C# 11:擴充nameof範圍功能規格。

另請參閱