【问题标题】:c# enums: can they take members and functions like java enums?c# enums:他们可以像 java enums 那样获取成员和函数吗?
【发布时间】:2009-09-14 15:00:23
【问题描述】:

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

我想知道这样的事情在 c# 枚举中是否也是可能的。如果有,怎么做?

非常感谢!

【问题讨论】:

    标签: c# java enums


    【解决方案1】:

    做类似的事情的唯一方法是使用扩展方法,这可以使它看起来好像枚举有成员方法。

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

    【讨论】:

      【解决方案2】:

      事实并非如此。在 Java 中,枚举是一个类,而在 C# 中,枚举只是包装原始类型的语法糖。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

          您可以模仿 Java TypeSafe 枚举模式(在 Java 5 中引入枚举以解决该问题之前,Java 中很常见):

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

          如果对象功能比开关功能更重要,你会这样做,因为在 C# 中没有它你可以获得类型安全(在 Java 5 之前你不能这样做)。

          【讨论】:

            【解决方案5】:

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

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

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

            您仍然需要利用另一个类来对枚举进行实际操作,但您可以使用属性来增加枚举的深度,而不是仅仅使用它基本上是的键/值对。

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                【解决方案7】:

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

                【讨论】:

                  【解决方案8】:

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

                  【讨论】:

                  • 您希望它进行正确的 OO 编程 - 将与枚举相关的行为与枚举本身放在一起,而不是到处都有 switch 子句。
                  • 因为我在 java 中经常这样做。它实际上是我最喜欢的功能之一;)例如,您有一个枚举高度,并且在每个枚举中您都有一个包含实际高度的附加最终成员。 SMALL.height = 80,NORMAL.height = 100,BIG.height = 120
                  • 我想这取决于你想让你的枚举做什么,但我无法想象需要我的枚举来做。至于它是 OO,通常我有一个包装枚举的类来提供我需要的任何 OO 主义。
                  • 我不认为像 SMALL.Height 这样的结构是合适的 OOP。在那种特殊情况下,您可以分配 SMALL = 80、NORMAL=100 等,然后让 Extension 方法 Height 将其转换为 Int 并返回它,但这仍然很难看。在使用自动枚举成员编号的一般情况下,您可以拥有一个静态数组,其中 Heights[(int)SMALL]=80.0 或者如果您需要字符串而不是浮点数或整数,则说“80px”。在更一般的情况下,您可以使用关联容器(哈希表或树)。
                  【解决方案9】:

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

                  【讨论】:

                    猜你喜欢
                    • 2010-10-18
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-03-15
                    • 1970-01-01
                    • 2023-01-04
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多