C#中的readonly跟const用法小結

來源:互聯網
上載者:User

標籤:ado   變數   nim   兩種   const   class   用法   失效   完成   

總結一下常量和唯讀欄位的區別:

由來:

      筆者也是在看歐立奇版的《.Net 程式員面試寶典》的時候,才發現自己長久以來竟然在弄不清出兩者的情況下,混用了這麼長的時間。的確,const與readonly 很像,都是將變數聲明為唯讀,且在變數初始化後就不可改寫。那麼,const與readonly 這兩個修飾符到底區別在什麼地方呢?其實,這個牽扯出C#語言中兩種不同的常量類型:靜態常量(compile-time constants)和動態常量(runtime constants)。這兩者具有不同的特性,錯誤的使用不僅會損失效率,而且還會造成錯誤。

      首先先解釋下什麼是靜態常量以及什麼是動態常量。靜態常量是指編譯器在編譯時間候會對常量進行解析,並將常量的值替換成初始化的那個值。而動態常量的值則是在啟動並執行那一刻才獲得的,編譯器編譯期間將其標示為唯讀常量,而不用常量的值代替,這樣動態常量不必在聲明的時候就初始化,而可以延遲到建構函式中初始化。

      當你大致瞭解上面的兩個概念的時候,那麼就可以來說明const與readonly了。const修飾的常量是上述中的第一種,即靜態常量;而readonly則是第二種,即動態常量。那麼區別可以通過靜態常量與動態常量的特性來說明:

      1)const修飾的常量在聲明的時候必須初始化;readonly修飾的常量則可以延遲到建構函式初始化 

      2)const修飾的常量在編譯期間就被解析,即常量值被替換成初始化的值;readonly修飾的常量則延遲到啟動並執行時候

      此外const常量既可以聲明在類中也可以在函數體內,但是static readonly常量只能聲明在類中。

一.值的區別:

常量(const):是已知的,不能修改的值。const都是靜態,不能使用static修飾。用類來訪問

唯讀欄位(readonly):只能在建構函式中修改的,唯讀欄位的值不能在編譯時間確定,而是在運行時確定的。

readonly可以用static修飾,也可以不用。

二.賦值方法區別:

常量(const):只能在聲明時賦值,常量的值在編譯時間就已經確定,在程式中不能改變。

唯讀欄位(readonly):唯讀欄位可以在聲明時或者在建構函式內賦值。唯讀欄位可以是靜態欄位(一個類只有一個值),也可以是執行個體欄位(每一個執行個體有自己的值)。

Const 定義的是靜態常在對象初始化的時候賦值.const修飾的常量必須在聲明的同時賦值,以後不能改變它的值.屬於編譯時間常量。不能用new初始化。

const修飾的常量為靜態變數,不能夠為對象所擷取

Readonly 是唯讀變數.屬於運行時變數.可以在類constructor裡改變它的值.不能作用於局部變數。

(因此被Readonly修飾的變數只能在初始化--聲明初始化或構造器初始化--的過程中賦值,其他地方不能進行對唯讀域的賦值操作)

readonly僅僅用於修飾class的field(欄位)

        public const int x = 10;        public const string a = "s";        public const User CA = null;        public readonly User CANew = new User();        public readonly User animal;        protected static readonly DateTime StartTime;

  

readonly和const都是用來標識常量的。

    • const可用於修飾class的field或者一個局部變數(local variable);而readonly僅僅用於修飾class的field。
    • const常量的值必定在編譯時間就已明確並且恒定的;而readonly常量卻有一點不同,那就是其值可以在運行時編譯,當然,它也必須遵守作為常量的約束,那就是值必須恒定不變。
    • const常量必須在聲明的同時對其進行賦值,並且確保該值在編譯時間可確定並恒定;而readonly常量則可以根據情況選擇在聲明的同時對其賦予一個編譯時間確定並恒定的值,或者將其值的初始化工作交給執行個體建構函式(instant constructor)完成。如:public readonly string m_Now = DateTime.Now.ToString();,m_Now會隨著運行時實際情況變化而變化。
    • const常量屬於類層級(class level)而不是執行個體對象層級(instant object level),並且它不能跟static結合一起使用,該常量的值將由整個類的所有執行個體對象共同分享(詳細論述參見後面的Remark地區)。
    • readonly常量既可以是類層級也可以是執行個體對象層級的,這取決於它的聲明以及初始化工作怎麼實施。readonly可以與static結合使用,用於指定該常量屬於類層級,並且把初始化工作交由靜態建構函式(static constructor)完成(有關如何把readonly常量聲明為類層級或執行個體對象層級的論述清參見後面的Remark地區) 。
    • 能被const修飾聲明為常量的類型必須是以下的基元類型(primitive type):sbyte,byte, short,ushort, int,uint,long,ulong, char,float, double,float, bool,decimal, string。
    • object, 數組(Array)和結構(struct)不能被聲明為const常量。
    • 一般情況下,參考型別是不能被聲明為const常量的,不過有一個例外:string。該參考型別const常量的值可以有兩種情況,string或null。其實,string雖然是參考型別,但是.NET卻對它特別處理,這種處理叫做字串恒定性(immutable),使得string的值具有唯讀特性。                                                

C#中的readonly跟const用法小結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.