在C#中,Java的枚举等效是什么?
在C#中,Java的枚举等效是什么?
完整的 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
哦,分部类型意味着您不必将所有枚举值都放在同一个文件中。如果每个值都非常复杂(这绝对是可能的),则每个值都可以有自己的文件。
枚举是为数不多的在java中比c#更好地实现的语言功能之一。在java中,枚举是某个类型的完整命名实例,而c#枚举基本上是命名常量。
话虽如此,对于基本情况,它们看起来会很相似。但是,在java中,您拥有更强大的功能,因为您可以向各个枚举添加行为,因为它们是完整的类。
您是否特别在寻找某些功能?