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 表达式部分。