购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP


陷阱03
并非寻常
——在程序中暴露常量时产生的陷阱

1.陷阱产生的场景

在程序代码中,经常可以看到常量的身影,常量是一种在编译时设置其值并且永远不能更改其值的特殊字段,它可以为特殊值提供有意义的名称以代替数字文本,这样可以增强程序的可阅读性。但是在程序中公开常量时,要特别小心,若处理不当,可能会给程序带来巨大隐患。

例4.3 在程序中暴露常量时产生的陷阱(光盘位置:光盘\MR\Instance\4\03\ My Library),该实例的MyLibary类库项目的主要代码如下:

在上面的代码中定义了一个公开的常量Name,由于常量的静态特性,所以常量可以使用类名称直接调用。

该实例的Run控制台项目的主要代码如下:

在上面的代码中,分别使用常量Name和实例方法GetName得到人物姓名。

在Run控制台项目的Debug文件夹下双击Run.exe文件,运行程序,其运行结果如下图4.5所示。

由于实际应用的需要,MyLibary类库项目中的程序需要发生改变,比如修改该项目中的Name常量值,具体代码如下:

修改程序完毕后,把MyLibary类库项目单独编译,生成MyLibary.dll类库文件,然后将这个类库文件复制到Run控制台项目的Debug文件夹下,覆盖存在的文件,最后再次运行当前目录下的Run.exe文件,其运行结果如图4.6所示。

图4.5 运行结果1

图4.6 运行结果2

通过查看运行结果可知,使用常量得到的姓名是“东方”,使用GetName方法得到的姓名是“西方”,但事实上MyLibary类库中的Name常量值已被更新为“西方”,那么为什么使用常量得到的值仍然是旧值呢?

2.陷阱的分析

分析这个问题要从常量的编译原理谈起,编译器在编译常量时,会将常量的值直接嵌入到IL代码中。那么对于本实例而言,在Run项目中,Lib.Name常量的值将被直接嵌入到IL代码中,当运行Run.exe文件时,程序直接从IL代码中读取Lib.Name常量的值,而在修改MyLibary类库后并没有重新编译Run项目,即IL代码中的Lib.Name常量的值仍保持旧值,这就是问题的所在。

3.陷阱的解决方法

解决办法有多种,这里提出以下两种建议。

❏ 重新编译整个解决方案,这是最简单的操作,但也是在实际项目开发中最不实用的,为了更新一个DLL文件,需要重新编译和发布整个项目资源。

❏ 不公开暴露常量,建议使用属性代替公共常量来对外公开数据。 /LymOIotlXpC04WWMCL7z0yMekN7pxzeSx4IJDHPgxJFG3pNVOU6dO1jByTND9lo

点击中间区域
呼出菜单
上一章
目录
下一章
×