精選文章

網站搬遷

 Hello all, 許久沒有寫部落格的習慣,未來會持續地在  https://alanzhan.dev/  更新

[C#] Effective - 02 偏好 readonly 而非 const

我們在定義常數的時候
到底該用 readonly ?
或者是用 const 好?
我們先來複習一下 const 與 readonly

工作原理

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比較

  1. 由於const在編譯時,將被替換成 literal ,所以只支援數值、字元、字串與列舉,然而readonly是支援任何型態的。
  2. const可以在方法中使用,readonly則不能。(但是常數不應該宣告在方法內)
  3. const在編譯時就產生了,readonly是在運行才產生的!
  4. const性能>readonly!
以上對於 const 與 readonly有複習到了吧!
那我們進入正題囉!
為什麼 標題是 偏好 readonly 而非 const呢?

假設 今天有段程式碼如下:

那麼結果應該 01234 對吧?

假設這段程式碼是由另一位工程師維護的時候,你今天剛好與該工程師合力修復BUG,但是你忘記重新編譯你的類別庫參考該工程師的類別庫之常數時......,或者其他人為因素,將會造成程式的異常。

可以看一下下列程式碼,現在要交付給客戶的常數B應該要被改為20,結果你沒有重新編譯你的dll或者其他問題,導致B常數還維持在5,結果常數A從其他地方取得,導致Main方法異常!

人為導致系統出錯的可能點太多了,所以建議使用readonly吧!除非你的常數將永遠不會變!


總結

偏好 readonly 而非 const!

如果你對於程式的性能追求的非常極致,或者這個值將永遠不會改變,例如:圓周率、一天的小時數等等,以上狀況建議使用const常數,除了以上的狀態以外,都應該優先採用readonly常數!

客官!你要 const 還是 readonly 呢?

留言

這個網誌中的熱門文章