这两项之间的性能影响是什么?我最近在野外看到了静态类,我不知道该怎么做。
public enum SomeEnum
{
One = 1,
Two,
Three
}
public static class SomeClass
{
public static readonly int One = 1;
public static readonly int Two = 2;
public static readonly int Three = 3;
}
区别在于类型安全。假设你有两个这样的枚举。你要怎么分辨呢?
void SomeMethod(int x, int y)
// Compiles, but won't do what you want.
SomeMethod(SomeOtherClass.Xyz, SomeClass.One);
和
void SomeMethod(SomeEnum x, SomeOtherEnum y)
// Compile-time error
SomeMethod(SomeOtherEnum.Xyz, SomeEnum.One)
所以每当你有一个表达式想要成为一组特定值中的一个,你可以让读者和编译器都清楚,如果你使用枚举,你对哪一组值感兴趣。只有整数…
枚举直接嵌入到IL中,而字段(就像您在类中拥有的字段)将需要字段加载指令,这可能会稍微昂贵一些。下面是调用一个接受enum和字段的方法的IL代码。
IL_0001: ldc.i4.1
IL_0002: call void ConsoleApplication2.Program::TestMethod(valuetype ConsoleApplication2.SomeEnum)
IL_0007: nop
IL_0008: ldc.i4.3
IL_0009: call void ConsoleApplication2.Program::TestMethod(valuetype ConsoleApplication2.SomeEnum)
IL_000e: nop
IL_000f: ldsfld int32 ConsoleApplication2.SomeClass::Two
IL_0014: call void ConsoleApplication2.Program::TestMethod(int32)
IL_0019: nop
IL_001a: ldsfld int32 ConsoleApplication2.SomeClass::One
IL_001f: call void ConsoleApplication2.Program::TestMethod(int32)
首先,类型安全,至少,类型安全不那么容易被绕过。例如,使用枚举值,我可以创建一个函数原型,如
void Foo(SomeEnum value);
而对于静态类,我必须接受int形参。当然,您可以抛弃类型安全,但它更容易使用,使其更明显,并且您还可以更轻松地执行转换。此外,enum提供了自动递增的值,在调试器中支持漂亮的打印,与控件(如属性网格)绑定的好处。