c#如何區分靜態只讀變量和常量

常量const

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

例如:spa

class Program
{
    const int a = 2;        
    
    static void Main(string[] args)
    {           
        Console.WriteLine(a);
        Console.ReadLine();
    }
}
Const Sample

那麼編譯以後的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)編譯器

 

靜態只讀static readonly

靜態只讀常量只是在某一個應用程序中初始化以後,不能對其進行修改。可是在不一樣的應用程序中能夠有不一樣的值。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

相關文章
相關標籤/搜索