C# 枚举:它们是否像 Java 枚举那样可以带有成员和函数?

3

在Java中,枚举可以拥有构造函数、成员变量和函数。

我想知道C#枚举是否也能实现这样的功能。如果可以,怎样实现呢?

非常感谢!

9个回答

4

唯一类似于这样的方法是使用扩展方法,它可以使枚举看起来像拥有成员方法。

除此之外,您可以创建一个伴随结构体类型到您的枚举中,该结构体有一个属性用于枚举值,并添加额外的属性和方法以支持该值。


1

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

Public Enum States
{
    [Description("Florida")]
    FL = 124
}

然后我有一个类,可以轻松地读取/写入描述属性,因此我可以将整个数据库代码表存储在枚举文件中。除了所有海报提出的扩展方法,您还可以使用属性来驱动与枚举类的日志。

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


1

不是这样的。在Java中,枚举是一个类,而在C#中,枚举只是将基本类型包装起来的语法糖。


1

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

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

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


1

你可以模仿Java的TypeSafe枚举模式(在Java 5引入枚举之前非常常见):

请参见此处的第21项(警告,PDF链接)进行描述。

如果对象功能比switch功能更重要,则应执行此操作,因为在C#中,您可以在没有它的情况下获得类型安全性(在Java 5之前无法实现)。


0
不是直接的但是你可以使用扩展方法来提供类似的功能

0

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


0
据我所知,在C#中,不能这样做。不过为什么你要这样做呢?似乎把变量和函数附加在一起有点奇怪!

2
你希望它进行适当的面向对象编程 - 将与枚举相关的行为放在枚举本身中,而不是在各个地方都有switch语句。 - Michael Borgwardt
因为我在Java中经常这样做。实际上,这是我最喜欢的功能之一 ;) 例如,您有一个枚举高度,在每个枚举值中都有一个包含实际高度的额外final成员。SMALL.height = 80,NORMAL.height = 100,BIG.height = 120 - clamp
我猜这取决于你想让你的枚举做什么,但我无法想象需要我的枚举去做那件事情。至于它是否面向对象,通常我会有一个类来包装一个枚举,以提供任何我需要的面向对象特性。 - Siyfion
我认为像SMALL.Height这样的结构不是合适的面向对象编程。在这种特殊情况下,您可以分配SMALL = 80,NORMAL = 100等,然后使用扩展方法Height将其转换为Int并返回它,但仍然相当丑陋。在自动枚举成员编号的一般情况下,您可以拥有一个静态数组,其中Heights [(int)SMALL] = 80.0或者如果您需要字符串而不是浮点数或整数,则说“80px”。在更一般的情况下,您可以使用关联容器(哈希表或树)。 - Zar Shardan

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接