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

本文关键字:枚举 静态类 常量 之间 区别 是什么 | 更新日期: 2023-09-27 17:48:58

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

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提供了自动递增的值,在调试器中支持漂亮的打印,与控件(如属性网格)绑定的好处。