常量就是一個其值永遠不會改變的靜態字段。常量的值會在編譯時自動推算,編譯器會在遇到常量時,將其逐個替換爲該常量的值。常量能夠是C#內建的任何數字類型或枚舉類型。聲明一個常量的時候必須對其進行初始化。ide
例如:spa
class Program { const int a = 2; static void Main(string[] args) { Console.WriteLine(a); Console.ReadLine(); } }
那麼編譯以後的IL的代碼有兩行值得注意:code
1. const int a=2; 編譯爲.field private static literal int32 a = int32(0x00000002)blog
2. 在Console.WriteLine以前,常量的值被編譯器推算出來:
IL_0001: ldc.i4.2;
IL_0002: call void [mscorlib]System.Console::WriteLine(int32)編譯器
靜態只讀常量只是在某一個應用程序中初始化以後,不能對其進行修改。可是在不一樣的應用程序中能夠有不一樣的值。string
一樣,對於上面的例子,若是咱們把變量a更改成靜態只讀,那麼IL代碼有哪些變化呢?it
1. static readonly int a=2;編譯爲.field private static initonly int32 a編譯
2.在Console.WriteLine以前,不會推算其值:
IL_0001: ldsfld int32 Learning.LinqDemo.ConsoleApp.Program::a
IL_0006: call void [mscorlib]System.Console::WriteLine(int32)event
簡單的一句話就能夠:常量在全部的程序中都是同一個值,而靜態只讀變量在不一樣的程序中能夠有不一樣的值。class