我們在定義常數的時候
到底該用 readonly ?
或者是用 const 好?
工作原理
readonly:程序在運行時才賦值,賦值之後即無法修改。
const:程序編譯時,對常量值進行解析,並且幫所有的常數引用替換為相對應的值。
下面有兩個常數 A 與 B
public static readonly int A = 0; // 運行時常數
public const int B = 5; // 編譯時常數
int C = A + B;
將過編譯之後將會變成:
int C = A + 5;
可以看到,const的常數B被替換成 literal 5,而readonly的常數A,則還是保持引用!
const與readonly比較
- 由於const在編譯時,將被替換成 literal ,所以只支援數值、字元、字串與列舉,然而readonly是支援任何型態的。
- const可以在方法中使用,readonly則不能。(但是常數不應該宣告在方法內)
- const在編譯時就產生了,readonly是在運行才產生的!
- const性能>readonly!
以上對於 const 與 readonly有複習到了吧!
那我們進入正題囉!
為什麼 標題是 偏好 readonly 而非 const呢?
假設 今天有段程式碼如下:
那麼結果應該 01234 對吧?
假設這段程式碼是由另一位工程師維護的時候,你今天剛好與該工程師合力修復BUG,但是你忘記重新編譯你的類別庫參考該工程師的類別庫之常數時......,或者其他人為因素,將會造成程式的異常。
可以看一下下列程式碼,現在要交付給客戶的常數B應該要被改為20,結果你沒有重新編譯你的dll或者其他問題,導致B常數還維持在5,結果常數A從其他地方取得,導致Main方法異常!
人為導致系統出錯的可能點太多了,所以建議使用readonly吧!除非你的常數將永遠不會變!
總結
偏好 readonly 而非 const!
如果你對於程式的性能追求的非常極致,或者這個值將永遠不會改變,例如:圓周率、一天的小時數等等,以上狀況建議使用const常數,除了以上的狀態以外,都應該優先採用readonly常數!
客官!你要 const 還是 readonly 呢?
留言
張貼留言