作者rosemary0401 (靠,为什麽没考上榜首)
看板C_Sharp
标题[问题] 常数的问题
时间Sun May 20 14:33:48 2012
书上说C#有两种常数
一个是const(compiler time常数)
另一个是readonly(runtime time常数)
const比较快,而readonly比较安全
如果在dll里面有一个const常数 (假设其值为 10)
然後client app载入这个dll并取得const常数值为10
後来dll改版将这一个const常数值改为20
结果client app没有rebuild的话,读到的值还会是10,而不是改版後的20
client app必须要rebuild才能得到正确的const常数值(值为20)
但是如果将const改为readonly的话就没有这个问题
为甚麽呢???
印象中C++应该不会有这样的问题(用c++写的client app,来读取c++写成的dll档),
改版後的的c++ dll档直接覆盖旧版本dll档
client app不需要rebuild也可以读到改版後正确的const值
难道是因为c++载入dll的方式和C#载入dll的方式有所不同吗????
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.240.143.125
1F:推 totte:编译後一个是常数,一个是变数 05/21 01:11
3F:推 rainbow001:笔记中... 05/21 11:05
4F:→ rosemary0401:为甚麽是常数的话 load dll就会产生错误? 05/21 18:40
Q1.为甚麽const编译後是常数的话,load改版後的dll就会出错??? (load到未改版的常数)
dll改版(将const值从10改为20)并且编译後是以MSIL的形式存在,
const就算编译过後是常数,在MSIL里也会是改版後的常数值(在此例中值为20)
为什麽将改版後的dll附盖掉之前的dll,还会load到旧的值(在此例中为10)
非得要load此dll的client AP重新编译过後,才能得到正确的结果???
Q2.为什麽C++的AP load的C++的dll不会有这样的问题???
因为c++和C# load dll的方式不一样?? 还是c++的const编译後是变数而不是常数???
※ 编辑: rosemary0401 来自: 111.240.143.125 (05/21 18:56)
5F:→ evirtues:你说的"load dll"是指执行期所发生的事而非编译时期发生 05/22 01:01
6F:→ evirtues:如totte所说,const是编译时期决定而readonly是执行时期 05/22 01:07