C#編程(十五)----------只讀字段


只讀字段

當字段聲明中含有 readonly 修飾符時,該聲明所引入的字段為只讀字段。給只讀字段的直接賦值只能作為聲明的組成部分出現,或在同一類中的實例構造函數或靜態構造函數中出現。(在這些上下文中,只讀字段可以被多次賦值。)准確地說,只在下列上下文中允許對 readonly 字段進行直接賦值:

在用於引入該字段的變量聲明符中(通過添加一個變量初始值設定項)。

對於實例字段,在包含字段聲明的類的實例構造函數中;對於靜態字段,在包含字段聲明的類的靜態構造函數中。也只有在這些上下文中,將 readonly 字段作為 out 或 ref參數傳遞才有效。

在其他任何上下文中,試圖對 readonly 字段進行賦值或將它作為 out 或 ref 參數傳遞都會導致一個編譯時錯誤。

常量成員和只讀成員的對比

聲明一個常量成員 : public const int MONTHS=12

成員常量的特征如下:

1.可以有修飾符(默認為private)

2.成員常量必須在聲明的時候初始化,如果 const int YEAR;(會報錯)

3.成員常量的值在初始化之后是不可改變的,

4.一條魚成可以聲明多個常量

const int months=12,weeks=52,days=365;

months,weeks,days都是常量

5.在聲明常量的時候,可以引用已經聲明的常量

const int dsysOfWeek=days/weeks;

6.常量就是靜態變量,常量被當做static字段一樣訪問.

class Person

{

const int age=20;

}

int age=Person.age;

7.不能聲明靜態常量,原因是存儲位置的不同,靜態字段有儲存位置,常量沒有自己的存儲位置.

聲明靜態常量的時候會報錯.

 

只讀字段

使用readonly修飾符聲明只讀字段.

class Person

{

readonly int age=20;

Person(int age)

{

this.age=age;

}

void ChangeAge()

{

age=19;//在初始化和構造函數之外不允許改變readonly字段的值.所以這是錯誤的.

}

 

}

1.const字段只能在聲明語句中初始化,而且必須初始化,初始化之后在任何地方都不能改變;readonly字段既可以在聲明時初始化,也可以在構造函數中改變它的值:如果是實例只讀字段,可以在實例構造函數中改變它的值,如果是靜態只讀字段,則可以在靜態構造函數中改變它的值。

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

  3.const總是像靜態字段,在類的外部要通過"類名.常量名"的方式訪問;readonly字段既可以是靜態字段,也可以是實例字段。

  4.const在內存中沒有存儲位置,而readonly字段在內存中有存儲位置。


免責聲明!

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



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