試煉5 - const 的坑踩過嗎

2022 鐵人賽文 搬回點部落

開始試煉

const 常數 這個關鍵字 常見的說明 就是把長久不會變的內容設定為常數像是
圓周率可以設定3.14這樣

void Main()
{
    var radius = 10;
    var area = Constants.Pi * radius * radius;
    area.Dump();
}
public static class Constants
{
    public const double Pi  = 3.14;
}

快要出新手村的各位,多多少少都會遇到分層的專案了吧
也就是參考DLL時 用 const 要非常小心
舉例來說 有兩個專案 一個是Web MVC專案 一個是Core專案
把上面Constants class 放在Core專案 然後在 Web MVC專案參考 Core.dll
有一天需求變了說Pi要改成 3.14159
於是 成這樣
public const double Pi = 3.14159;
然後重建方案後 想說只有改 Core 專案 就只有更新Core.dll
這時候才會發現 Web MVC專案的 Pi 還是3.14

因為 const 常數 就不會變 所以編譯器 就幫你把所有用到Pi的地方都替換成3.14了
編譯過的程式碼根本不會有Pi存在
編譯過的程式碼就像是這樣

void Main()
{
    var radius = 10;
    var area = 3.14 * radius * radius;
    area.Dump();
}

所以 我基本上知道這原理後沒用過 const 一律用 static readonly 就像是試煉1的程式碼
當然效能上const是最好自己想想看情境囉

延伸試煉

有一篇文章講解得非常清楚 很推薦觀看
C# - const vs static readonly

結束試煉

這個試煉 算是我實際遇到的問題 遇過一次印象深刻阿

程式碼都是用LINQPad 5寫的應該複製貼上就可以執行

如果內容有誤請多鞭策謝謝