版本6.0增加了nameof的新特性,但我不能理解它的用途,因为它只接受变量名并在编译时将其更改为字符串.

我想它在使用<T>时可能会有一些用途,但当我try 使用nameof(T)时,它只会打印T,而不是使用的类型.

你知道目的吗?

推荐答案

如果希望重用属性名称,例如在基于属性名称引发异常或处理PropertyChanged个事件时,情况会如何.在很多情况下,你都想知道房产的名称.

举个例子:

switch (e.PropertyName)
{
    case nameof(SomeProperty):
    { break; }

    // opposed to
    case "SomeOtherProperty":
    { break; }
}

在第一种情况下,如果不同时更改属性定义和nameof(SomeProperty)表达式,重命名SomeProperty将导致编译错误.在第二种情况下,重命名SomeOtherProperty或更改"SomeOtherProperty"字符串将导致运行时行为silent中断,在生成时不会出现错误或警告.

这是一种非常有用的方法,可以保持代码编译和无bug(类似).

(A very nice article from Eric Lippert为什么infoof没有成功,而nameof成功)

.net相关问答推荐

Docker镜像mcr.microsoft.com/dotnet/aspnet:8.0不能在Windows上构建

.Net MAUI Android 无法与 API localhost 对话

使用 PowerShell 从文件夹中获取文件名的最快\最好的方法是什么?

是否可以将 SandCastle 创建的两个页面合并到一个主页中?

xunit Assert.ThrowsAsync() 不能正常工作?

单击关闭按钮时隐藏表单而不是关闭

.Include() 与 .Load() 在 EntityFramework 中的性能

设置日志(log)文件名以在 Log4j 中包含当前日期

如何将浮点数向上舍入到 C# 中最近的 int?

Select 文件夹对话框 WPF

为什么字典比列表快得多?

获取类型的默认构造函数的最有效方法

如何在不丢失数据的情况下重命名 Entity Framework 5 Code First 迁移中的数据库列?

找不到 Assert.Fail 和 Assert.Pass 或等效项

将属性序列化为元素中的 Xml 属性

一个接口是否应该继承另一个接口

Linq to SQL - 返回前 n 行

List 是否保证项目将按照添加的顺序返回?

C# ListView 列宽自动

当它被抛出和捕获时,不要在那个异常处停止调试器