3

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

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

3 回答 3

15

区别在于类型安全。假设您有两个这样的枚举。您将如何区分:

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)

因此,无论你有一个表达式想要成为一组特定值中的一个,如果你使用枚举,你可以让读者编译器清楚地知道你对哪组值感兴趣。只有整数......不是那么多。

于 2011-04-05T20:59:42.190 回答
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)
于 2011-04-05T21:17:03.947 回答
2

好吧,一方面,类型安全,至少是不容易绕过的类型安全。例如,使用枚举值我可以创建一个函数原型,例如

void Foo(SomeEnum 值);

而对于您的静态类,我将不得不采用一个 int 参数。当然,您可以抛弃类型安全,但它更易于使用且更明显,并且您还可以更轻松地执行转换。此外,枚举提供自动递增的值、调试器中的漂亮打印支持、与属性网格等控件的绑定优势。你明白了。

于 2011-04-05T21:00:36.887 回答