我正在尝试从枚举中获取文本,例如
public enum MyEnum {
Bar,
Foo
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,获取字符串Bar
或Foo
使用MyEnum.Bar
/ MyEnum.Foo
。
我意识到 和MyEnum.Bar.ToString()
都会nameof(MyEnum.Bar)
返回我想要的字符串(Bar
/ Foo
)。
ToString
所以我的问题是,使用or之间有区别吗nameof
?
如果是,推荐的使用方式是什么?
主要区别在于它foo.ToString()
是在运行时评估的,并且nameof(foo)
是编译器功能,因此字符串是在编译时烘焙的。
第二个区别是,原则上它们是不同的:ToString()
是一种仅返回对象的 \xe2\x80\x9c 文本表示形式\xe2\x80\x9d 的方法,这是一个相当弱的保证,同时为nameof
您提供了您传递给它的任何内容的名称,如源代码中所写。
对于枚举常量,您比较用法的方式几乎没有什么区别,尽管除了nameof
技术上更便宜一些之外。但有很多东西的名称实际上并不是它的标识或首选字符串表示形式,nameof
实际上更多的是为了创建对可能最终出现在字符串中的命名事物的重构或重命名安全引用。将异常消息视为引用参数名称或INotifyPropertyChanged
将属性名称引用为字符串。
我的建议是实际写下您的意图。如果您想要特定类型或成员的名称,请使用nameof
。如果您想要某物的字符串表示形式,请使用ToString
. 大多数时候,您无论如何都无法使用EnumConstant.ToString()
,因为变量中更有可能有某些内容,在这种情况下nameof
不会有任何好处,除非您想要该变量的名称。