枚举和使用带常量的静态类有什么区别?

这两个项目之间的性能影响是什么? 我最近看到了野外的静态类,我不知道该怎么做。

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); 

VS

 void SomeMethod(SomeEnum x, SomeOtherEnum y) // Compile-time error SomeMethod(SomeOtherEnum.Xyz, SomeEnum.One) 

因此, 无论您在哪里都有一个想要成为特定值集合的表达式,如果您使用枚举,您可以向读者编译器明确表示您感兴趣的值集。 只有整体……不是那么多。

枚举直接嵌入到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) 

嗯,首先,类型安全,至少,类型安全不容易规避。 例如,使用枚举值我可以创建一个函数原型,如

void Foo(SomeEnum value);

而对于静态类,我必须采用int参数。 当然,您可以抛弃类型安全性,但它更容易使用并使其更加明显,您还可以更轻松地执行转换。 此外,enum提供了自动递增的值,调试器中的漂亮打印支持,绑定带有属性网格等控件的好处。 你明白了。