枚举在 Java 和 C# 中是完全不同的东西。在 C# 中,它们只是整数类型的名称,在 Java 中,它们更像是具有命名默认值的类。在 C# 中,具有一堆静态只读字段或属性的类是 Java 所谓的枚举,减去switch
它们的能力。
这种模式确实每隔一段时间就会出现一次,请System.Drawing.Color
参阅System.Text.Encoding
就像大多数事情一样,只要你不滥用它,这是一种很好的做法。此模式通常用于只为类或结构提供命名默认值。确保该类可以独立存在,并且您不会严重依赖这些属性的名称。如果您需要偶尔检查某些内容,那么您可能可以摆脱==
运算符的重载。
如果您想要与 Java 的枚举完全相同的东西,那么您应该有一个内部存储类型的 C# 枚举,并执行以下两项操作之一:
- 使所有构造函数都需要枚举
- 创建在内部设置枚举的命名默认值
例子:
public enum FooType
{
A,
B,
C
}
public class Foo
{
public FooType Type { get; private set; }
// Option 1: forced via constructor
public Foo(FooType type)
{
this.Type = type;
}
// Option 2: static properties
// (using the constructor from option 1, can be done without it, though)
public static Foo A { get { return new Foo(FooType.A); } }
public static Foo B { get { return new Foo(FooType.B); } }
public static Foo C { get { return new Foo(FooType.C); } }
}
用法:
Foo bar = new Foo(FooType.B);
// OR
Foo bar = Foo.B;
切换能力:
switch (bar.Type)
{
case FooType.A:
break;
case FooType.B:
break;
case FooType.C:
break;
}