在C#中,Java的枚举等效是什么?

2022-09-01 15:03:22

在C#中,Java的枚举等效是什么?


答案 1

完整的 Java 枚举功能在 C# 中不可用。不过,您可以使用嵌套类型和私有构造函数来合理地接近。例如:

using System;
using System.Collections.Generic;
using System.Xml.Linq;

public abstract class Operator
{
    public static readonly Operator Plus = new PlusOperator();
    public static readonly Operator Minus = 
         new GenericOperator((x, y) => x - y);
    public static readonly Operator Times = 
         new GenericOperator((x, y) => x * y);
    public static readonly Operator Divide = 
         new GenericOperator((x, y) => x / y);

    // Prevent other top-level types from instantiating
    private Operator()
    {
    }

    public abstract int Execute(int left, int right);

    private class PlusOperator : Operator
    {
        public override int Execute(int left, int right)
        {
            return left + right;
        }
    }

    private class GenericOperator : Operator
    {
        private readonly Func<int, int, int> op;

        internal GenericOperator(Func<int, int, int> op)
        {
            this.op = op;
        }

        public override int Execute(int left, int right)
        {
            return op(left, right);
        }
    }
}

当然,您不必使用嵌套类型,但它们提供了方便的“自定义行为”部分,Java枚举非常适合。在其他情况下,您可以只将参数传递给私有构造函数,以获取一组众所周知的受限值。

这不会给你一些东西:

  • 序数支持
  • 交换机支持
  • EnumSet
  • 序列化/反序列化(作为单例)

其中一些可能可以通过足够的努力来完成,尽管如果没有黑客攻击,切换就不可行。现在,如果该语言做了这样的事情,它可以做一些有趣的事情,通过使黑客自动切换(例如,自动声明字段的负载,并将枚举类型上的任何切换更改为整数上的切换,只允许“已知”情况)。const

哦,分部类型意味着您不必将所有枚举值放在同一个文件中。如果每个值都非常复杂(这绝对是可能的),则每个值都可以有自己的文件。


答案 2

枚举是为数不多的在java中比c#更好地实现的语言功能之一。在java中,枚举是某个类型的完整命名实例,而c#枚举基本上是命名常量。

话虽如此,对于基本情况,它们看起来会很相似。但是,在java中,您拥有更强大的功能,因为您可以向各个枚举添加行为,因为它们是完整的类。

您是否特别在寻找某些功能?