常量const
常量就是一個其值永遠不會改變的靜態字段。常量的值會在編譯時自動推算,編譯器會在遇到常量時,將其逐個替換為該常量的值。常量可以是C#內建的任何數字類型或枚舉類型。聲明一個常量的時候必須對其進行初始化。
例如:

class Program { const int a = 2; static void Main(string[] args) { Console.WriteLine(a); Console.ReadLine(); } }
那么編譯之后的IL的代碼有兩行值得注意:
1. const int a=2; 編譯為.field private static literal int32 a = int32(0x00000002)
2. 在Console.WriteLine之前,常量的值被編譯器推算出來:
IL_0001: ldc.i4.2;
IL_0002: call void [mscorlib]System.Console::WriteLine(int32)
靜態只讀static readonly
靜態只讀常量只是在某一個應用程序中初始化之后,不能對其進行修改。但是在不同的應用程序中可以有不同的值。
同樣,對於上面的例子,如果我們把變量a更改為靜態只讀,那么IL代碼有哪些變化呢?
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)
兩者的區別:
簡單的一句話就可以:常量在所有的程序中都是同一個值,而靜態只讀變量在不同的程序中可以有不同的值。