这两项之间的性能影响是什么?我最近在野外见过静态类,我不知道该怎么做。
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;
}
答案 0 :(得分:15)
区别在于类型安全。假设你有两个这样的枚举。你怎么说出差异:
void SomeMethod(int x, int y)
// Compiles, but won't do what you want.
SomeMethod(SomeOtherClass.Xyz, SomeClass.One);
VS
void SomeMethod(SomeEnum x, SomeOtherEnum y)
// Compile-time error
SomeMethod(SomeOtherEnum.Xyz, SomeEnum.One)
所以无处不在你有一个想要成为一组特定值的表达式,你可以向读者和清楚地告诉编译器哪一组您使用枚举时感兴趣的值。只有整体...而不是那么多。
答案 1 :(得分:4)
枚举直接嵌入到IL中,而字段(比如你的类中的字段)将需要一个字段加载指令,这可能稍贵一些。以下是用于调用接受枚举与字段的方法的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)
答案 2 :(得分:2)
嗯,首先,类型安全,至少,类型安全不容易被规避。例如,使用枚举值,我可以创建一个函数原型,如
void Foo(SomeEnum值);
对于静态类,我必须使用int参数。当然,您可以抛弃类型安全性,但它更容易使用并使其更加明显,您还可以更轻松地执行转换。此外,enum提供自动递增的值,调试器中的漂亮打印支持,绑定带有属性网格等控件的好处。你明白了。