[C#] Const & Readonly

[C#] Const & Readonly

如果一個變數希望它無法修改時,此時會使用常數(const),當常數使用在動態連結庫(Dynamic Link Library),必須注意到一個小陷阱,當修改dll裡的常數,編譯完讓專案參考它時,如果沒有建置或編譯則會導致專案裡的常數依舊沒有修改。

首先建立一個dll,並且在裡面宣告常數,這邊多宣告一個static的變數來做比對

接著建立站台並在page中去呼叫它,這邊會發現雖然TestConstInDLL沒有宣告這兩個變數為static,卻可以不用建立實例就可以用它,主要的原因是,static 修飾詞不能用於常數宣告。const本身視為static。


page

接著我們來看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為運行期才決定它是什麼。

 

如文章有錯誤,煩請告知,新人發帖請多包涵

 

創用 CC 授權條款