【发布时间】:2009-09-14 15:00:23
【问题描述】:
在 java 中,可以为枚举提供构造函数以及成员变量和函数。
我想知道这样的事情在 c# 枚举中是否也是可能的。如果有,怎么做?
非常感谢!
【问题讨论】:
在 java 中,可以为枚举提供构造函数以及成员变量和函数。
我想知道这样的事情在 c# 枚举中是否也是可能的。如果有,怎么做?
非常感谢!
【问题讨论】:
做类似的事情的唯一方法是使用扩展方法,这可以使它看起来好像枚举有成员方法。
除此之外,您可以为您的枚举创建一个伴随结构类型,该类型具有枚举值的属性,然后添加其他属性和方法来支持该值。
【讨论】:
事实并非如此。在 Java 中,枚举是一个类,而在 C# 中,枚举只是包装原始类型的语法糖。
【讨论】:
枚举是强类型常量。它们本质上是唯一的类型,允许您将符号名称分配给整数值。在 C# 传统中,它们是强类型的,这意味着即使其成员的基础值相同,一种类型的枚举也可能不会隐式分配给另一种类型的枚举。同样,整数类型和枚举不是隐式可互换的。不同枚举类型和整数类型之间的所有赋值都需要显式转换。
您不能在枚举中使用成员变量或构造函数。也许你正在寻找的是一个结构。
结构类型是一种值类型,可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型。结构的声明采用以下形式:
【讨论】:
您可以模仿 Java TypeSafe 枚举模式(在 Java 5 中引入枚举以解决该问题之前,Java 中很常见):
有关说明,请参阅第 21 项 here(警告,PDF 链接)。
如果对象功能比开关功能更重要,你会这样做,因为在 C# 中没有它你可以获得类型安全(在 Java 5 之前你不能这样做)。
【讨论】:
我一直喜欢做的一件事是在我的枚举上使用 Description 属性,这样我就可以轻松地存储我的枚举的 3 个值
Public Enum States
{
[Description("Florida")]
FL = 124
}
然后我有一个类可以轻松地从描述属性读取/读取,这样我就可以将整个数据库代码表存储在一个枚举文件中。除了提出扩展方法的所有海报之外,您还可以使用属性来驱动枚举类的日志。
您仍然需要利用另一个类来对枚举进行实际操作,但您可以使用属性来增加枚举的深度,而不是仅仅使用它基本上是的键/值对。
【讨论】:
不直接,但您可以使用扩展方法来提供类似的功能
【讨论】:
这在 C# 中是不可能的。枚举只能有名称/值成员。
【讨论】:
据我所知,不,你不能在 C# 中。虽然你为什么也想要?附加变量和函数似乎有点奇怪!
【讨论】:
您可以为枚举类型定义扩展方法,但不能为枚举添加状态,因为枚举在内部表示为简单的整数类型,并且没有地方存储状态。
【讨论】: