C#中有兩種常量類型,分別為readonly(運行時常量)與const(編譯時常量),本文將就這兩種類型的不同特性進行比較並說明各自的適用場景。
工作原理
readonly為運行時常量,程序運行時進行賦值,賦值完成後便無法更改,因此也有人稱其為只讀變量。
const為編譯時常量,程序編譯時將對常量值進行解析,並將所有常量引用替換為相應值。
下面聲明兩個常量:
數據類型支持
由於const常量在編譯時將被替換為字面量,使得其取值類型受到了一定限制。const常量只能被賦予數字(整數、浮點數)、字符串以及枚舉類型。下面的代碼無法通過編譯:
可維護性
readonly以引用方式進行工作,某個常量更新後,所有引用該常量的地方均能得到更新後的值。
const的情況要稍稍復雜些,特別是跨程序集調用:
假設Class1與Class2位於兩個不同的程序集,現在更改Class1中的常量值:
性能比較
const直接以字面量形式參與運算,性能要略高於readonly,但對於一般應用而言,這種性能上的差別可以說是微乎其微。
適用場景
在下面兩種情況下:
a.取值永久不變(比如圓周率、一天包含的小時數、地球的半徑等)
b.對程序性能要求非常苛刻
可以使用const常量,除此之外的其他情況都應該優先采用readonly常量。
public class Class1
編譯Class1並部署(注意:這時並沒有重新編譯Class2),再次查看變量C的值:
Console.WriteLine(Class2.C); //輸出"7"結果可能有點出乎意料,讓我們來仔細觀察變量C的賦值表達式:
public static int C = Class1.A + Class1.B;編譯後與下面的形式等價:
public static int C = Class1.A + 3;因此不管常量B的值如何變,對最終結果都不會產生影響。雖說重新編譯Class2即可解決這個問題,但至少讓我們看到了const可能帶來的維護問題。
public class Class1