看板 C_Sharp 關於我們 聯絡資訊
書上說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
totte:編譯後一個是常數,一個是變數 05/21 01:11
totte:http://ppt.cc/lg5, 05/21 01:13
rainbow001:筆記中... 05/21 11:05
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)
evirtues:你說的"load dll"是指執行期所發生的事而非編譯時期發生 05/22 01:01
evirtues:如totte所說,const是編譯時期決定而readonly是執行時期 05/22 01:07