C# readonly 和const比較C#中的readonly與const

來源:互聯網
上載者:User

轉載: http://www.cnblogs.com/Kenny-Jiang/archive/2008/05/26/1207969.html

比較C#中的readonly與const 

    C#中有兩種常量類型,分別為readonly(運行時常量)與const(編譯時間常量),本文將就這兩種類型的不同特性進行比較並說明各自的適用情境。

工作原理
    readonly為運行時常量,程式運行時進行賦值,賦值完成後便無法更改,因此也有人稱其為唯讀變數。
    const為編譯時間常量,程式編譯時間將對常量值進行解析,並將所有常量引用替換為相應值。
    下面聲明兩個常量:

public static readonly int A = 2; //A為運行時常量
public const int B = 3; //B為編譯時間常量

    下面的運算式:

int C = A + B;

    經過編譯後與下面的形式等價:

int C = A + 3;

    可以看到,其中的const常量B被替換成字面量3,而readonly常量A則保持引用方式。

聲明及初始化
    readonly常量只能聲明為類欄位,支援執行個體類型或靜態類型,可以在聲明的同時初始化或者在建構函式中進行初始化,初始化完成後便無法更改。
    const常量除了可以聲明為類欄位之外,還可以聲明為方法中的局部常量,預設為靜態類型(無需用static修飾,否則將導致編譯錯誤),但必須在聲明的同時完成初始化。

資料類型支援

    由於const常量在編譯時間將被替換為字面量,使得其取實值型別受到了一定限制。const常量只能被賦予數字(整數、浮點數)、字串以及枚舉類型。下面的代碼無法通過編譯:

public const DateTime D = DateTime.MinValue;

    改成readonly就可以正常編譯:

public readonly DateTime D = DateTime.MinValue;


可維護性

    readonly以引用方式進行工作,某個常量更新後,所有引用該常量的地方均能得到更新後的值。
    const的情況要稍稍複雜些,特別是跨程式集調用:

public class Class1
{
    public static readonly int A = 2; //A為運行時常量
    public const int B = 3; //B為編譯時間常量
}

public class Class2
{
    public static int C = Class1.A + Class1.B; //變數C的值為A、B之和 
}

Console.WriteLine(Class2.C); //輸出"5"

    假設Class1與Class2位於兩個不同的程式集,現在更改Class1中的常量值:

public class Class1
{
    public static readonly int A = 4; //A為運行時常量
    public const int B = 5; //B為編譯時間常量
}

    編譯Class1並部署(注意:這時並沒有重新編譯Class2),再次查看變數C的值:

Console.WriteLine(Class2.C); //輸出"7"

    結果可能有點出乎意料,讓我們來仔細觀察變數C的賦值運算式:

public static int C = Class1.A + Class1.B;

    編譯後與下面的形式等價:

public static int C = Class1.A + 3;

    因此不管常量B的值如何變,對最終結果都不會產生影響。雖說重新編譯Class2即可解決這個問題,但至少讓我們看到了const可能帶來的維護問題。

效能比較
    const直接以字面量形式參與運算,效能要略高於readonly,但對於一般應用而言,這種效能上的差別可以說是微乎其微。

適用情境
    在下面兩種情況下:
    a.取值永久不變(比如圓周率、一天包含的小時數、地球的半徑等)
    b.對程式效能要求非常苛刻
    可以使用const常量,除此之外的其他情況都應該優先採用readonly常量。

    C#中有兩種常量類型,分別為readonly(運行時常量)與const(編譯時間常量),本文將就這兩種類型的不同特性進行比較並說明各自的適用情境。

工作原理
    readonly為運行時常量,程式運行時進行賦值,賦值完成後便無法更改,因此也有人稱其為唯讀變數。
    const為編譯時間常量,程式編譯時間將對常量值進行解析,並將所有常量引用替換為相應值。
    下面聲明兩個常量:

public static readonly int A = 2; //A為運行時常量
public const int B = 3; //B為編譯時間常量

    下面的運算式:

int C = A + B;

    經過編譯後與下面的形式等價:

int C = A + 3;

    可以看到,其中的const常量B被替換成字面量3,而readonly常量A則保持引用方式。

聲明及初始化
    readonly常量只能聲明為類欄位,支援執行個體類型或靜態類型,可以在聲明的同時初始化或者在建構函式中進行初始化,初始化完成後便無法更改。
    const常量除了可以聲明為類欄位之外,還可以聲明為方法中的局部常量,預設為靜態類型(無需用static修飾,否則將導致編譯錯誤),但必須在聲明的同時完成初始化。

資料類型支援

    由於const常量在編譯時間將被替換為字面量,使得其取實值型別受到了一定限制。const常量只能被賦予數字(整數、浮點數)、字串以及枚舉類型。下面的代碼無法通過編譯:

public const DateTime D = DateTime.MinValue;

    改成readonly就可以正常編譯:

public readonly DateTime D = DateTime.MinValue;


可維護性

    readonly以引用方式進行工作,某個常量更新後,所有引用該常量的地方均能得到更新後的值。
    const的情況要稍稍複雜些,特別是跨程式集調用:

public class Class1
{
    public static readonly int A = 2; //A為運行時常量
    public const int B = 3; //B為編譯時間常量
}

public class Class2
{
    public static int C = Class1.A + Class1.B; //變數C的值為A、B之和 
}

Console.WriteLine(Class2.C); //輸出"5"

    假設Class1與Class2位於兩個不同的程式集,現在更改Class1中的常量值:

public class Class1
{
    public static readonly int A = 4; //A為運行時常量
    public const int B = 5; //B為編譯時間常量
}

    編譯Class1並部署(注意:這時並沒有重新編譯Class2),再次查看變數C的值:

Console.WriteLine(Class2.C); //輸出"7"

    結果可能有點出乎意料,讓我們來仔細觀察變數C的賦值運算式:

public static int C = Class1.A + Class1.B;

    編譯後與下面的形式等價:

public static int C = Class1.A + 3;

    因此不管常量B的值如何變,對最終結果都不會產生影響。雖說重新編譯Class2即可解決這個問題,但至少讓我們看到了const可能帶來的維護問題。

效能比較
    const直接以字面量形式參與運算,效能要略高於readonly,但對於一般應用而言,這種效能上的差別可以說是微乎其微。

適用情境
    在下面兩種情況下:
    a.取值永久不變(比如圓周率、一天包含的小時數、地球的半徑等)
    b.對程式效能要求非常苛刻
    可以使用const常量,除此之外的其他情況都應該優先採用readonly常量。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.