[問題] 常數的問題

看板C_Sharp作者 (靠,為什麼沒考上榜首)時間12年前 (2012/05/20 14:33), 編輯推噓3(303)
留言6則, 4人參與, 最新討論串1/1
書上說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

05/21 01:11, , 1F
編譯後一個是常數,一個是變數
05/21 01:11, 1F

05/21 01:13, , 2F
05/21 01:13, 2F

05/21 11:05, , 3F
筆記中...
05/21 11:05, 3F

05/21 18:40, , 4F
為甚麼是常數的話 load dll就會產生錯誤?
05/21 18:40, 4F
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)

05/22 01:01, , 5F
你說的"load dll"是指執行期所發生的事而非編譯時期發生
05/22 01:01, 5F

05/22 01:07, , 6F
如totte所說,const是編譯時期決定而readonly是執行時期
05/22 01:07, 6F
文章代碼(AID): #1Fk91FSw (C_Sharp)