[C#] readonly vs const


C#中的readonly和const兩個關鍵字都可以用來定義系統變量,那兩者之間有什么區別呢?

1. const變量賦值后,就不可以對其進行修改。且在定義時就需要給它賦值,使用const修飾的變量是static的。可以使用YourClass.ConstantName的方式進行訪問;

2. readonly變量可以在定義時賦值,也可以在構造方法中賦值或者修改定義時賦給的初始值;

另外還有一個細微的差別。看下面的場景,我在AssemblyA中定義了一個類如下:

    public class Readonly_VS_Const
    {
        public const int I_Const_Value = 100;

        public readonly int I_Readonly_Value = 20;

        public Readonly_VS_Const()
        {
            I_Readonly_Value = 55;
        }
    }

在AssemblyB中引用了AssemblyA,並且使用了這些常量,

    static void Main(string[] args)
    {
        int constValue = Readonly_VS_Const.I_Const_Value;

        Readonly_VS_Const vs = new Readonly_VS_Const();

        int readonlyValue = vs.I_Readonly_Value;

        Console.WriteLine("Const Value:{0}--Readonly Value:{1}", 
            constValue, readonlyValue);

        Console.ReadKey();
    }

查看一下IL代碼,

注意查看使用黃色和綠色框標記的兩行代碼。

假設AssemblyA和AssemblyB編譯完成后均放在AssemblyB的目錄下

1. const變量類似與一種替換的方式,直接將定義的100寫入到IL代碼中。當我修改了I_Const_Value的值為200后,AssemblyB需要在程序重新編譯后才能獲得更新后的數值;

2. readonly的變量值,很像ref類型,readonly值不會直接寫入到AssemblyB的IL代碼中,這就意味者如果AssemblyA中readonly的值被修改后,你只需要重新編譯一下AssemblyA即可。AssemblyB在調用時會找到根據變量的內存位置讀取修改后的值。

static readonly vs const,

onst和static readonly的確很像:通過類名而不是對象名進行訪問,在程序中只讀等等。在多數情況下可以混用。
二者本質的區別在於,const的值是在編譯期間確定的,因此只能在聲明時通過常量表達式指定其值。而static readonly是在運行時計算出其值的,所以還可以通過靜態構造函數來賦值。

請看下面的例子:

    class Program
    {
        static readonly int A = B * 10;

        static readonly int B = 10;

        static void Main(string[] args)
        {
            Console.WriteLine("A: {0} B: {1}", A, B);
        }
    }

結果如下:

將static readonly修改為const,

    class Program
    {
        const int A = B * 10;

        const int B = 10;

        static void Main(string[] args)
        {
            Console.WriteLine("A: {0} B: {1}", A, B);
        }
    }

結果如下:

那么為什么是這樣的呢?const是靜態常量,所以在編譯的時候就將A與B的值確定下來了(即B變量時10,而A=B*10=10*10=100),那么Main函數中的輸出當然是A is 100,B is 10啦。而static readonly則是動態常量,變量的值在編譯期間不予以解析,所以開始都是默認值,像A與B都是int類型,故都是0。而在程序執行到A=B*10;所以A=0*10=0,程序接着執行到B=10這句時候,才會真正的B的初值10賦給B。

感謝您的閱讀!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM