[C#] Const & Readonly
如果一個變數希望它無法修改時,此時會使用常數(const),當常數使用在動態連結庫(Dynamic Link Library),必須注意到一個小陷阱,當修改dll裡的常數,編譯完讓專案參考它時,如果沒有建置或編譯則會導致專案裡的常數依舊沒有修改。
首先建立一個dll,並且在裡面宣告常數,這邊多宣告一個static的變數來做比對
接著建立站台並在page中去呼叫它,這邊會發現雖然TestConstInDLL沒有宣告這兩個變數為static,卻可以不用建立實例就可以用它,主要的原因是,static 修飾詞不能用於常數宣告。const本身視為static。
接著我們來看page顯示出來的結果
正確無誤,接著把dll裡面的常數更動並建置,
TestConstInPage程式碼如上沒有更動。
接著我們來看dll變動後,結果是否也有變動,直接複製TestConstInDLL覆蓋TestConstInPage的bin資料夾中的TestConstInDLL。
我們將第一次的輸出去做比較,發現常數的變數並沒有變動,而變數卻有改變,這是為什麼呢。
如果是使用主控台應用程式就可以用反組譯去看產生的EXE檔,會發現常數沒有改變,必須要重新編譯後值才會修正,而這就是const的特性,因此在使用常數時,必須小心這一點,建議常數應該使用在函數裡面,以下圖是我將常數放置方法中,讓我們來看它會不會變動。
顯示結果:
修改dll、建置、並且將建置後的dll放置站台bin資料夾下
顯示結果:
這次就有照我們想的如期出現該出現的數字,因此在使用常數時,要思考這一個小小的陷阱,除非每次更動dll都會重新編譯一次應用程式或重新啟動站台,但是每次修改dll就要使用者重新下載一次或請業主更換應用程式,這有點詭異吧。
站台比較不會有這種問題,畢竟維護時,大多時候會發公告,更新時會暫停站台或有另一台站台支援,更新完會重新啟動,不過會包成dll相信就不一定使用在web上面,因此對於這點還是要注意。
既然說了const ,順便提到他的兄弟Readonly。
readonly 可以接納更多種的型態,const只能接受整數、浮點數、字串、NULL...等,大致上就只有數字跟字串。
const 欄位僅可以在該欄位宣告時初始化。而欄位則是可以在宣告或是在建構函式中初始化。
readonly如宣告時沒有初始化,則可以在建構子中初始化。const不給初始值,就給紅色毛毛蟲。
先來看看readonly是不是跟const一樣有同樣的小陷阱。
dll
結果
改變值
結果
結論:
寫了這麼多,可能還讓人看不懂,總結一句話,說明以上內容:
const為編譯期就決定它的一生,readonly為運行期才決定它是什麼。
如文章有錯誤,煩請告知,新人發帖請多包涵