C#如何使用nameof表达式 C# nameof运算符使用技巧

3次阅读

nameof 是 C# 6.0 引入的编译时运算符,将标识符转换为字符串字面量,支持重构、避免拼写错误,适用于变量、属性、方法、类型等,但不支持表达式或动态名称。

C#如何使用nameof表达式 C# nameof运算符使用技巧

nameof 是 C# 6.0 引入的编译时运算符,它不执行任何运行时操作,只在编译期将标识符(如变量名、方法名、属性名、类型名等)转换为对应的字符串字面量。它安全、高效,且支持重构 —— 重命名时自动同步,不会出现“魔法字符串”问题。

避免硬编码字符串,提升可维护性

传统写法容易出错:

if (value == NULL) throw new ArgumentNullException(“valu”); // 拼错!

nameof 后,拼写由编译器保障:

if (value == null) throw new ArgumentNullException(nameof(value));

ide 重命名 value 变量时,nameof(value) 会自动更新,不会遗漏。

适用于各类成员和上下文

nameof 可作用于:

C#如何使用nameof表达式 C# nameof运算符使用技巧

N世界

一分钟搭建会展元宇宙

C#如何使用nameof表达式 C# nameof运算符使用技巧 138

查看详情 C#如何使用nameof表达式 C# nameof运算符使用技巧

  • 局部变量、参数: nameof(input)
  • 字段/属性: nameof(User.Name)(返回 “Name”)
  • 方法: nameof(ToString)nameof(GetUserById)
  • 类型: nameof(string) → “String”,nameof(List<int>)</int> → “List`1”
  • 命名空间或类嵌套: nameof(MyNamespace.MyClass.MyProperty) → “MyProperty”(只取最后一段)

注意:不能用于表达式或字符串拼接,例如 nameof(x + y)nameof("abc") 都会编译失败。

在日志、验证和反射场景中特别实用

常见模式示例:

  • 参数验证Guard.Against.Null(user, nameof(user))
  • 日志记录logger.LogWarning("Failed to process {PropertyName}", nameof(Config.TimeoutMs))
  • INotifyPropertyChangedOnPropertyChanged(nameof(FirstName))(比 "FirstName" 更安全)
  • 配置绑定提示:当配置项缺失时,提示用户检查 nameof(appSettings.DatabaseUrl) 对应的配置键

小技巧与注意事项

几个实用细节:

  • 支持点号访问,但只解析到最后一个标识符:nameof(obj.Property)nameof(Property) 结果相同
  • 泛型类型名带反引号和数字:nameof(List<string>)</string> 返回 “List`1″,不是 “List
  • 可用于 const string 初始化:private const string NameKey = nameof(User.Name);(编译期确定)
  • 不能用于动态对象、匿名类型属性、或未声明的名称 —— 编译器必须能静态识别该标识符

基本上就这些。用好 nameof,代码更健壮,重构更安心。

text=ZqhQzanResources