nameof 表达式(C# 参考)

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

var 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

如前面的示例所示,对于类型和命名空间,生成的名称不是完全限定的名称。

逐字标识符的情况下,@ 字符不是名称的一部分,如以下示例所示:

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

nameof 表达式在编译时进行求值,在运行时无效。

可以使用 nameof 表达式使参数检查代码更易于维护:

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

运算符的参数 nameof 必须位于范围内。 从 C# 11 开始,参数和类型参数在属性内用于运算符。nameof 以下示例演示 nameof 了用于方法、本地函数和 lambda 表达式的参数:

[ParameterString(nameof(msg))]
public static void Method( string msg)
{
    [ParameterString(nameof(param))]
    void LocalFunction(string param) { }

    var lambdaExpression = [ParameterString(nameof(aNumber))] (int aNumber) => aNumber.ToString();

}

使用可为 Null 的分析属性时,在nameof参数上使用最有用。

C# 语言规范

有关详细信息,请参阅 C# 语言规范中的 Nameof 表达式部分。

请参阅