C# 什么';s枚举和;使用带有常量的静态类?

C# 什么';s枚举和;使用带有常量的静态类?,c#,performance,enums,static-classes,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; } 区

这两个项目之间的性能影响是什么?我最近在野外看到了静态类,我不知道该如何理解它

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 Foo(SomeEnum值)


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

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

除了类型安全(已经回答)之外,您还可以在枚举上使用
Flags
属性,这在某些应用程序中很有用。对于某些应用程序来说,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)