我已经写了七年C#,我一直在想,为什么枚举必须是一个完整的类型?做以下事情不是很好吗:
enum ErrorMessage
{
NotFound: "Could not find",
BadRequest: "Malformed request"
}
Run Code Online (Sandbox Code Playgroud)
这是语言设计选择,还是在编译器,CLR或IL级别上存在基本的不兼容性?
其他语言是否包含字符串或复杂(即对象)类型的枚举?什么语言?
(我知道解决方法;我的问题是,为什么需要它们?)
编辑:"workarounds"=具有consts的属性或静态类:)
Enum的目的是为整数提供更有意义的值.你正在寻找Enum以外的其他东西.枚举与旧的Windows API和COM东西兼容,并且在其他平台上也有很长的历史.
也许你会对结构或类的公共const成员感到满意.
或者您可能尝试将某些特殊类型值限制为仅某些字符串值?但它如何存储以及如何显示它可能是两个不同的东西 - 为什么要使用比存储值更多的空间?
如果你想在某些持久化格式中使用可读的东西,只需使用实用程序或Extension方法将其吐出即可.
这种反应有点乱,因为原因很多.比较两个字符串的有效性要比比较两个整数要昂贵得多.将文字字符串与已知的枚举进行比较以进行静态类型检查有点不合理.本地化会......很奇怪.兼容性将被打破.作为标志的枚举将毫无意义/破坏.
这是一个Enum.这就是Enums所做的!他们是不可或缺的!
也许使用System.ComponentModel中的description属性并编写一个辅助函数来从枚举值中检索关联的字符串?(我在我使用的代码库中看到过这个,似乎是一个非常合理的选择)
enum ErrorMessage
{
[Description("Could not find")]
NotFound,
[Description("Malformed request")]
BadRequest
}
Run Code Online (Sandbox Code Playgroud)
有什么好处,因为我只能看到缺点:
ToString将返回一个不同的字符串到枚举的名称.也就是说,ErrorMessage.NotFound.ToString()将是"找不到"而不是"NotFound".Enum.Parse,它会做什么?它仍然会接受,因为它确实为整数枚举,或者它以字符串工作枚举的字符串名称值?[Flags],因为你会ErrorMessage.NotFound | ErrorMessage.BadRequest在你的榜样等于(我知道,它并没有真正意义在这种特殊情况下,我想你可以只说,[Flags]不允许对基于字符串的枚举但似乎仍像我一样的缺点)errMsg == ErrorMessage.NotFound可以作为简单的参考比较errMsg == "Could not find"来实现,但是需要将其实现为字符串比较.我想不出有什么好处,特别是因为它是很容易建立自己的字典映射枚举值到"定制"的字符串.
| 归档时间: |
|
| 查看次数: |
734 次 |
| 最近记录: |