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#实现压缩文件

    话说当今压缩市场三足鼎立,能叫上名号的有zip、rar、7z。其中zip是压缩界的鼻祖,在各大平台上的流行度最广,rar是商业软件,压缩率和效率都是很高的。7z是开源的,属于后起之秀。这篇文章介绍了如何使用ICSharpCode组件,在windows平台下zip的压缩与解压的方法
    2021-06-06
  • WPF实时绘制心率曲线的示例详解

    WPF实时绘制心率曲线的示例详解

    这篇文章主要为大家详细介绍了WPF实时绘制心率曲线的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • c# 托盘双击不触发单击事件的实现方法

    c# 托盘双击不触发单击事件的实现方法

    在开发winform的时候我发现,当执行双击操作(notifyIcon1_MouseDoubleClick)时,会同时伴随着单击事件(notifyIcon1_MouseClick)的发生。。那如何才能使双击事件不触发单击事件呢?
    2009-02-02
  • 总结C#处理异常的方式

    总结C#处理异常的方式

    这篇文章介绍了C#处理异常的方式总结,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • C#操作NPOI实现Excel数据导入导出

    C#操作NPOI实现Excel数据导入导出

    这篇文章主要为大家详细介绍了C#如何操作NPOI实现Excel数据导入导出功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-02-02
  • C# 8.0中的范围类型(Range Type)示例详解

    C# 8.0中的范围类型(Range Type)示例详解

    这篇文章主要给大家介绍了关于C# 8.0中范围类型(Range Type)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • 如何使用C#在PDF文件添加图片印章

    如何使用C#在PDF文件添加图片印章

    文档中添加印章可以起一定的作用,比如,防止文件随意被使用,或者确保文档内容的安全性和权威性。C#添加图片印章其实也有很多实现方法,这里我使用的是免费的第三方软件Free Spire.PDF,向大家阐述如何以编程的方式在PDF文件中添加图片印章
    2017-01-01
  • c# socket网络编程接收发送数据示例代码

    c# socket网络编程接收发送数据示例代码

    这篇文章主要介绍了c# socket网络编程,server端接收,client端发送数据,大家参考使用吧
    2013-12-12
  • C#实现汉字转拼音(多音字)功能详解

    C#实现汉字转拼音(多音字)功能详解

    这篇文章主要为大家详细介绍了如何利用C#实现汉字转拼音(支持多音字)的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-02-02
  • C#使用iTextSharp生成PDF的示例代码

    C#使用iTextSharp生成PDF的示例代码

    这篇文章主要为大家详细介绍了C#如何使用iTextSharp生成PDF的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下
    2024-03-03

最新评论