C# 中 Java 的枚举相当于什么?
最佳答案
完整的 Java 枚举功能在 C# 中不可用。不过,您可以使用嵌套类型和私有(private)构造函数合理地关闭。例如:
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 枚举非常适合。在其他情况下,您只需将参数传递给私有(private)构造函数即可获取众所周知的受限值集。
这并没有给你一些东西:
- 顺序支持
- 开关支持
枚举集
- 序列化/反序列化(作为单例)
其中一些可能只需付出足够的努力就可以完成,但如果没有黑客技术,切换实际上是不可行的。现在,如果 语言 做了这样的事情,它可以做一些有趣的事情,通过使骇客自动化(例如,自动声明 const
字段的负载,并更改任何将枚举类型切换为整数,仅允许“已知”情况。)
哦,部分类型意味着您不必将所有枚举值放在同一个文件中。如果每个值都参与其中(这绝对是可能的),那么每个值都可以有自己的文件。
关于c# - C# 中的 Java 枚举相当于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1376312/