C#基礎 [12] 成員常量和唯讀欄位

來源:互聯網
上載者:User

一、成員常量

  1.常量

    常量是在編譯時間已知並在程式的生存期內不發生更改的不可變值。常量使用 const 修飾符進行聲明。只有 C# 內建類型(System.Object 除外)可以聲明為 const,使用者定義的類型(包括類、結構和數組)不能為 const。常量分為成員常量和本地常量。

  2.成員常量

    成員常量就是聲明在類中的常量,它與前面講過的本地常量相似,只是範圍不同:本地常量只存在方法中,而成員常量存在於類當中。

    下面是一個聲明成員常量的樣本,MyCalendar類中包含一個成員常量months:

1     class MyCalendar2     {3         // 聲明一個成員常量4         public const int months = 12;         5     }

    成員常量有如下特徵:

      1).成員常量使用const關鍵字聲明,並且可以有修飾符(預設為private)。這一點在上例中已經得到了證明。

      2).成員常量必須在聲明的時候初始化。試圖聲明一個沒有初始設定式的成員常量將會得到如所示的錯誤提示:

        

      3).成員常量的值在初始化之後是不可改變的,即使是在類內部也不行。在上面的樣本中,常量 months 始終為 12,不可更改。實際上,當編譯器遇到             C# 原始碼(例如 months)中的常量修飾符時,將直接把文本值替換到它產生的中繼語言 (IL) 代碼中。因為在運行時沒有與常量關聯的變數地址,所以 const 欄位不能通過引用傳遞,並且不能在運算式中作為左值出現。在代碼中強行修改常量值,編譯器將會提示如所示的錯誤訊息:

        

      4).在一條語句中可以同時聲明多個相同類型的常量。

1         // 同時聲明多個int型成員常量2         const int months = 12, weeks = 52, days = 365;

      5).用於初始化一個常量的運算式可以引用另一個常量。例如,下面的成員常量聲明引用了上面已經聲明的常量。

1         // 在聲明常量時,可以引用已經聲明的常量2         const double daysPerWeek = (double)days / (double)weeks;3         const double daysPerMonth = (double)days / (double)months;

      6).常量就像靜態變數。因為常量值對該類型的所有執行個體是相同的,所以成員常量被當作 static 欄位一樣訪問。未包含在定義常量的類中的運算式必須使用類名、一個句點和常量名來訪問該常量。例如:

1             // 使用類名訪問成員常量2             var m = MyCalendar.months;

      7).不能聲明靜態常量。雖然常量與靜態欄位的訪問方式一樣,但是不能聲明static常量。因為常量與真正的靜態欄位不同:靜態欄位有儲存位置,而常量沒有自己的儲存位置,常量在編譯時間被編譯器替換為了與宣告類型一致的字面量。下面是上面的months常量反編譯為IL語言之後的代碼:

1  // 成員常量已經被替換為了整型字面量(literal)2 .field public static literal int32 months = int32(12)

      聲明static常量將會得到所示的錯誤提示:

      

二、唯讀欄位

  可以使用readonly修飾符聲明唯讀欄位。readonly 關鍵字是可以在欄位上使用的修飾符。當欄位聲明包括 readonly 修飾符時,該聲明引入的欄位賦值只能作為聲明的一部分出現,或者出現在同一類的建構函式中。

View Code

 1     class MyAge 2     { 3         // 聲明一個唯讀欄位,在聲明的同時初始化 4         readonly int _year = 1; 5  6         // 建構函式 7         MyAge(int year) 8         { 9             // 在建構函式中改變唯讀欄位的值10             _year = year;11         }12         void ChangeYear()13         {14             //_year = 1967; // 在初始化和建構函式之外,不可改變readonly欄位的值.15         }16     }

三、成員常量和唯讀欄位不同

  1.const欄位只能在聲明語句中初始化,而且必須初始化,初始化之後在任何地方都不能改變;readonly欄位既可以在聲明時初始化,也可以在建構函式中改變它的值:如果是執行個體唯讀欄位,可以在執行個體建構函式中改變它的值,如果是靜態唯讀欄位,則可以在靜態建構函式中改變它的值。

  2.const欄位的值必須在編譯器決定,編譯完成之後它的值就被替換為字面量;readonly欄位的值可以在運行時決定,可以在不同的建構函式中設定不同的值。

  3.const總是像靜態欄位,在類的外部要通過"類名.常量名"的方式訪問;readonly欄位既可以是靜態欄位,也可以是執行個體欄位。

  4.const在記憶體中沒有儲存位置,而readonly欄位在記憶體中有儲存位置。

參考:成員常量:http://msdn.microsoft.com/zh-cn/library/ms173119(VS.100).aspx

   唯讀欄位:http://msdn.microsoft.com/zh-cn/library/acdd6hb7(VS.100).aspx

 

聯繫我們

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