只讀字段
當字段聲明中含有 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字段在內存中有存儲位置。
