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)