c#enum:它们可以像java enum那样接受成员和函数吗?

c#enum:它们可以像java enum那样接受成员和函数吗?,c#,java,enums,C#,Java,Enums,在java中,可以为枚举提供构造函数以及成员变量和函数 我想知道在c#enum中是否也可以这样做。如果是,怎么做 非常感谢 执行类似操作的唯一方法是使用扩展方法,它可以使枚举看起来好像有成员方法一样 除此之外,您可以为枚举创建一个附带的结构类型,该结构类型具有枚举值的属性,然后添加其他属性和方法以支持该值。不是直接的,但您可以使用扩展方法提供类似的功能。这在C#中是不可能的。枚举只能有名称/值成员 据我所知,不,你不能在C。虽然你为什么也想要?附加变量和函数似乎也有点奇怪 事实并非如此。在Jav

在java中,可以为枚举提供构造函数以及成员变量和函数

我想知道在c#enum中是否也可以这样做。如果是,怎么做


非常感谢

执行类似操作的唯一方法是使用扩展方法,它可以使枚举看起来好像有成员方法一样


除此之外,您可以为枚举创建一个附带的结构类型,该结构类型具有枚举值的属性,然后添加其他属性和方法以支持该值。

不是直接的,但您可以使用扩展方法提供类似的功能。

这在C#中是不可能的。枚举只能有名称/值成员

据我所知,不,你不能在C。虽然你为什么也想要?附加变量和函数似乎也有点奇怪

事实并非如此。在Java中,枚举是一个类,而在C#中,枚举只是一个基本类型。

您可以为枚举类型定义扩展方法,但不能向枚举添加状态,因为枚举在内部表示为简单的整数类型,没有地方存储状态。

枚举是强类型常量。它们本质上是唯一的类型,允许您将符号名称指定给整数值。在C#传统中,它们是强类型的,这意味着一种类型的枚举不能隐式地分配给另一种类型的枚举,即使它们的成员的基础值相同。同样,整数类型和枚举也不是隐式可交换的。不同枚举类型和整数类型之间的所有赋值都需要显式强制转换

不能在枚举中使用成员变量或构造函数。也许你要找的是一个结构


结构类型是一种值类型,可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型。结构的声明采用以下形式:

您可以模仿Java类型安全枚举模式(在Java 5中引入枚举之前,Java中非常常见的枚举模式):

有关说明,请参见第21项(警告,PDF链接)


如果对象功能比开关功能更重要,那么您可以这样做,因为在C#中,您可以在没有类型saftey的情况下获得类型saftey(这在5之前的Java中是无法做到的)。

我一直喜欢做的一件事是在枚举上使用Description属性,这样我就可以轻松地存储枚举的3个值

Public Enum States
{
    [Description("Florida")]
    FL = 124
}
然后我有了一个类,可以很容易地读取description属性,这样我就可以在一个枚举文件中存储整个数据库代码表。除了所有提出扩展方法的海报外,您还可以使用属性驱动枚举类的日志


您仍然需要利用另一个类来实际处理枚举,但您可以使用属性来为枚举添加更多深度,而不仅仅是拥有基本上的键/值对。

您希望它使用枚举本身执行适当的OO编程,而不是使用开关子句来执行与枚举相关的put行为到处都是。因为我用java做了很多。这实际上是我最喜欢的功能之一;)例如,您有一个枚举高度,并且在每个枚举高度中都有一个包含实际高度的附加最终成员。SMALL.height=80,NORMAL.height=100,BIG.height=120我想这取决于你想要你的枚举做什么,但我无法想象需要我的枚举来做什么。至于OO,通常我有一个封装枚举的类来提供我需要的任何OO ism。我不认为像SMALL这样的构造。Height是合适的OOP。在这种特殊情况下,您可以指定SMALL=80、NORMAL=100等,然后让扩展方法Height将其转换为Int并返回它,但这仍然非常糟糕。在自动枚举成员编号的一般情况下,如果需要字符串而不是浮点或整数,则可以使用高度[(int)SMALL]=80.0的静态数组,或者说“80px”。在更一般的情况下,您可以使用关联容器(哈希表或树)。