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
范围功能规范。