C#中nameof的实现实例

 更新时间:2025年11月20日 10:01:32   作者:lfw2019  
本文主要介绍了C#中nameof的实现实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 C# 中,nameof 是一个上下文关键字(contextual keyword),用于在编译时获取 变量、类型或成员的名称,并以字符串形式返回。它的主要作用是避免硬编码字符串,提高代码的可维护性和健壮性,尤其是在需要引用标识符名称的场景中(如异常处理、日志记录、数据绑定等)。

基本用法

nameof 可以用于以下场景:

  1. 获取变量名

    string myVariable = "Hello";
    string variableName = nameof(myVariable); // 返回 "myVariable"
  2. 获取属性名

    public class MyClass 
    {
        public string MyProperty { get; set; }
    }
    
    MyClass obj = new MyClass();
    string propertyName = nameof(obj.MyProperty); // 返回 "MyProperty"
  3. 获取类型名

    string typeName = nameof(MyClass); // 返回 "MyClass"
  4. 获取方法名

    public void MyMethod() 
    {
        string methodName = nameof(MyMethod); // 返回 "MyMethod"
    }
  5. 获取命名空间或泛型类型的部分名称

    Console.WriteLine(nameof(System.Collections.Generic)); // 输出 "Generic"
    Console.WriteLine(nameof(List<int>)); // 输出 "List"
    Console.WriteLine(nameof(List<int>.Count)); // 输出 "Count"

典型应用场景

1.异常处理

在参数校验时,使用 nameof 可以明确指出问题所在的参数或属性:

public string UserName 
{
    get => _userName;
    set 
    {
        if (string.IsNullOrEmpty(value))
        {
            throw new ArgumentException("Name cannot be null or empty.", nameof(UserName));
        }
        _userName = value;
    }
}
  • 如果 UserName 被设置为空,抛出的异常会明确显示 "UserName" 作为参数名。

2.日志记录

在日志中记录代码元素的名称,避免硬编码字符串:

Console.WriteLine($"Initializing {nameof(Color)} enum"); // 输出 "Initializing Color"

3.数据绑定与模型验证

在 MVC 或数据绑定框架中,结合 nameof 生成验证消息:

public class UserModel 
{
    [Required(ErrorMessage = $"The {nameof(UserName)} field is required.")]
    public string UserName { get; set; }
}
  • 如果 UserName 被重命名,nameof 会自动更新,避免字符串错误。

4.单元测试

在测试中明确标识测试的目标方法或属性:

[TestMethod]
public void TestUserNameProperty() 
{
    var service = new UserService();
    Assert.ThrowsException<ArgumentException>(() => service.UserName = "", 
        $"Setting {nameof(UserService.UserName)} to empty should throw.");
}

与ToString()的区别

特性nameofToString()
执行时机编译时(生成字符串常量)运行时(调用方法)
返回内容标识符的名称(如变量、属性名)对象的字符串表示(如值或自定义格式)
示例nameof(myVariable) → "myVariable"myVariable.ToString() → "Hello"

枚举的对比

enum Color { Red, Green, Blue }
Color myColor = Color.Green;

string a = nameof(myColor);      // 返回 "myColor"(变量名)
string b = nameof(Color.Blue);   // 返回 "Blue"(枚举成员名)
string c = myColor.ToString();   // 返回 "Green"(枚举值的名称)

注意事项

编译时操作
nameof 在编译时求值,因此不会引入运行时开销。

不支持局部变量
不能用于局部变量(如方法内部定义的变量):

void MyMethod() 
{
    int x = 10;
    string name = nameof(x); // ❌ 错误:x 是局部变量
}

忽略 @ 符号
如果标识符以 @ 开头(如 @class),@ 会被忽略:

var @new = 5;
Console.WriteLine(nameof(@new)); // 输出 "new"

泛型类型的限制
nameof(T) 返回的是泛型参数名(如 "T"),而非实际类型名。若需要实际类型名,需结合反射:

public void GenericMethod<T>() 
{
    string typeName = nameof(T); // 返回 "T"
    // 使用反射获取实际类型名:
    Type actualType = typeof(T);
    string actualTypeName = actualType.Name; // 如 "String"
}

C# 11 的新特性

C# 11 开始,nameof 可用于 方法参数属性

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

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

总结

nameof 是 C# 中非常实用的工具,尤其在需要引用标识符名称的场景中(如异常处理、日志记录、数据绑定)。它的核心优势包括:

  • 避免硬编码字符串,减少错误。
  • 编译时检查,确保代码健壮性。
  • 提高可读性和可维护性,特别是在重构时自动更新名称。

通过合理使用 nameof,可以编写出更清晰、更可靠的代码。

到此这篇关于C#中nameof的实现实例的文章就介绍到这了,更多相关C# nameof内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于C#继承的简单应用代码分析

    关于C#继承的简单应用代码分析

    在本篇文章里小编给大家整理了一篇关于C#继承的简单应用代码分析内容,有兴趣的朋友们可以学习下。
    2021-05-05
  • C#存储相同键多个值的Dictionary实例详解

    C#存储相同键多个值的Dictionary实例详解

    在本篇文章里小编给大家整理的是关于C#存储相同键多个值的Dictionary实例内容,需要的朋友们可以学习下。
    2020-03-03
  • C#使用XML序列化操作菜单的方法

    C#使用XML序列化操作菜单的方法

    这篇文章主要介绍了C#使用XML序列化操作菜单的方法,是基于上一篇递归读取XML菜单数据的改进方法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • C#调用百度翻译API实现一个翻译功能

    C#调用百度翻译API实现一个翻译功能

    一直喜欢用Google Translate API进行在线翻译,但是服务越来越慢这篇文章,所以只能换一个了,主要给大家介绍了关于C#调用百度翻译API实现一个翻译功能的相关资料,需要的朋友可以参考下
    2021-06-06
  • 详解WPF如何显示具有层级关系的数据

    详解WPF如何显示具有层级关系的数据

    这篇文章主要为大家详细介绍了在WPF中如何显示具有层级关系的数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • 京东联盟C#接口测试示例分享

    京东联盟C#接口测试示例分享

    这篇文章主要介绍了京东联盟C#接口测试示例分享的相关资料,需要的朋友可以参考下
    2017-12-12
  • c#可以创建任意控件的拖动方法

    c#可以创建任意控件的拖动方法

    下面小编就为大家分享一篇c#可以创建任意控件的拖动方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • C#实现简单的Http请求实例

    C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下
    2015-01-01
  • C#利用Refit实现JWT自动续期详解

    C#利用Refit实现JWT自动续期详解

    Refit 是一个受到Square的Retrofit库(Java)启发的自动类型安全REST库,这篇文章主要为大家介绍了C#如何利用Refit实现JWT自动续期,感兴趣的可以了解下
    2023-08-08
  • C#使用List类实现动态变长数组的方法

    C#使用List类实现动态变长数组的方法

    这篇文章主要介绍了C#使用List类实现动态变长数组的方法,涉及C#中List类的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04

最新评论