前言
不知道大家對const和readonly關鍵字兩者的區別了解多少,如果你也不是很清楚的話,那就一起來探討吧!探討之前我們先來了解靜態常量和動態常量。
- 靜態常量
所謂靜態常量就是在編譯期間會對變量進行解析,再將常量的值替換成初始化的值。
- 動態常量
所謂動態常量就是編譯期間會將變量標記只讀常量,而不用常量的值代替,這樣在聲明時可以不初始化,可以延遲到構造函數初始化。
const和readonly
const修飾的常量是上述中的第一種,即靜態常量,而readonly是上述中第二種即動態常量。他們的區別可以從靜態常量和動態常量的特性來說明:
- const修飾的常量在聲明時必須初始化值;readonly修飾的常量可以不初始化值,且可以延遲到構造函數。
- cons修飾的常量在編譯期間會被解析,並將常量的值替換成初始化的值;而readonly延遲到運行的時候。
- const修飾的常量注重的是效率;readonly修飾的常量注重靈活。
- const修飾的常量沒有內存消耗;readonly因為需要保存常量,所以有內存消耗。
- const只能修飾基元類型、枚舉類、或者字符串類型;readonly卻沒有這個限制。
代碼測試
1. 如果我們在const修飾的常量前加static的話,會提示錯誤,因為const編譯后就是static常量了。(PM:如果不編譯的話,編輯器不會報錯。編譯后,再提示錯誤! )
class Program { static const int temp = 100; static void Main(string[] args) { } }

2. readonly修飾的在構造函數中被賦值后就不可以改變。


3.代碼如下:
class Program { static readonly int A = B * 10; static readonly int B = 10; public static void Main(string[] args) { Console.WriteLine("A is {0},B is {1} ", A, B); Console.ReadLine(); } }

readonly是動態常量,在編譯期間是不會解析的,所以開始就是默認值, A和B都是int類型,值都是0,所以A=0*10=0,程序接着執行到B=10,才會真正的B的初值10賦給B。
