这两个项目之间的性能影响是什么?我最近在野外看到了静态类,但我不知道该怎么做。
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);
对比
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 值);
而对于您的静态类,我将不得不采用一个 int 参数。当然,您可以抛弃类型安全,但它更易于使用且更明显,并且您还可以更轻松地执行转换。此外,枚举提供自动递增的值、调试器中的漂亮打印支持、与属性网格等控件的绑定优势。你明白了。