摘自我自己的博客,原文地址:点击这里.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项目,那样运行结果还是不会变的。

解决方案 »

  1.   

    顶,最好下次能排版一下,加上ubb标记。
    最好还是dll更新后,同步更新exe。不止枚举,还有字段升级为属性,也是类似的情况。字段的访问是直接变量访问,属性的访问是方法调用。dll中作此操作,exe也需要重新编译。个人认为,更新dll后最好还是重新发布exe。谁也说不准哪些变了要改,不小心就会错。不过枚举,一般都是维护的时候往末端添加的。
      

  2.   

    呵呵,.net 里修改任何代码,不重新编译都不会生效。
      

  3.   

    通常都是solution编译,这样细节的确很少有人注意。