enums&和en之间的区别是什么?使用带常量的静态类?

时间:2011-04-05 20:57:31

标签: c# performance enums static-classes

这两项之间的性能影响是什么?我最近在野外见过静态类,我不知道该怎么做。

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

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提供自动递增的值,调试器中的漂亮打印支持,绑定带有属性网格等控件的好处。你明白了。