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

从 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();
}

在使用可为空的分析属性CallerArgumentExpression 属性时,带有参数的 nameof 表达式很有用。

C# 语言规范

有关详细信息,请参阅 C# 语言规范Nameof 表达式 部分和 C# 11 - 扩展 nameof 范围功能规范。

请参阅