作者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