枚举与常量需要注意的一个问题

jintianhu2000 2010-10-29 08:55:10
摘自我自己的博客,原文地址:点击这里

.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项目,那样运行结果还是不会变的。

...全文
168 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jintianhu2000 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fangxinggood 的回复:]
呵呵,一开始没有,后来明白了。着急发言的确。。。
[/Quote]
呵呵 怎么的我也不能发没有点内涵的帖子吧 哈哈
jintianhu2000 2010-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ly210501076 的回复:]
同意楼上说的,代码修改后不重新编译是不会生效的……
[/Quote]

两位应该是完全没看明白我写的重点在哪。。。
机器人 2010-10-29
  • 打赏
  • 举报
回复
通常都是solution编译,这样细节的确很少有人注意。
小人物扫雷 2010-10-29
  • 打赏
  • 举报
回复
同意楼上说的,代码修改后不重新编译是不会生效的……
机器人 2010-10-29
  • 打赏
  • 举报
回复
呵呵,.net 里修改任何代码,不重新编译都不会生效。
兔子-顾问 2010-10-29
  • 打赏
  • 举报
回复
顶,最好下次能排版一下,加上ubb标记。
最好还是dll更新后,同步更新exe。不止枚举,还有字段升级为属性,也是类似的情况。字段的访问是直接变量访问,属性的访问是方法调用。dll中作此操作,exe也需要重新编译。个人认为,更新dll后最好还是重新发布exe。谁也说不准哪些变了要改,不小心就会错。不过枚举,一般都是维护的时候往末端添加的。
机器人 2010-10-29
  • 打赏
  • 举报
回复
呵呵,一开始没有,后来明白了。着急发言的确。。。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧