摘自我自己的博客,原文地址:
点击这里
.net中枚举其实就是数值型的常量,与const类似。当我们在代码中使用枚举代表的数值或者常量时,编译器其实是将该值直接写过来,而不会在运行的时候去读取该值。
下面是一个例子:
我们想建立一个类库项目,名称叫A,再建立一个控制台项目,名称叫Test,结构如下:
A项目中的 MyClass.cs的代码:
01 public class MyClass
02 {
03 public static string str1="str1";
04
05 public const string str2="str2";
06 }
07
08 public enum MyEnum
09 {
10 One=1,
11 Two=2,
12 Three=3
13 }
定义了一个枚举以及一个静态字段、一个常量字段。
Test项目引用A项目,代码如下:
01 class Program
02 {
03 static void Main(string[] args)
04 {
05 Console.WriteLine((int)MyEnum.One);
06 Console.WriteLine(MyEnum.One.ToString());
07
08 Console.WriteLine(MyClass.str1);
09 Console.WriteLine(MyClass.str2);
10 }
11 }
我们来看看Program类用Reflector工具反编译后的样子:
1 private static void Main(string[] args)
2 {
3 Console.WriteLine(1);
4 Console.WriteLine(MyEnum.One.ToString());
5 Console.WriteLine(MyClass.str1);
6 Console.WriteLine("str2");
7 }
编译器将(int)MyEnum.One的值与常量字段str2直接硬编码写到代码中,而不是在运行期再去读取。
这样处理的后果是:如果你修改了A项目中的枚举的排列顺序或者枚举对应的值(或者改变了常量字段str2的值),比如将MyEnum.One的值2,同时不重新编译Test项目,那样运行结果还是不会变的。