Readonly
Readonly可修飾字段,表示此字段只能在定義處或構造器修改值,
來看DEMO
class Test
{
public readonly int i = 3;
public Test()
{
i = 4;
}
public void OtherMethod()
{
//i = 5;//error messages->錯誤 1 無法對只讀的字段賦值(構造函數或變量初始值指定項中除外)
}
}
二,需要注意的是,可以采用反射(reflection)來修改readonly字段,當某個字段是引用類型,並且該字段標記為readonly時,它就是不可改變的引用,而不是字段所引用的對象。以下代碼對此進行了演示:
class Test2
{
public static readonly Char[] InvalidChars = new Char[] { ''A'', ''B'', ''C'' };
//public static readonly string[] InvalidStrings = new string[] { "A", "B", "C" };
public static readonly int b = 1;
static Test2()
{
b = 2;
}
public int getIntValue()
{ return b;
}
}
class Program
{
static void
{
//下面三行代碼是合法的,可以通過編譯,並可以成功修改InvalidChars數組
//中的字符
Test2.InvalidChars[0] = ''X'';
//Test2.InvalidStrings[0] = "wmj";//string[]類型
//此方式,沒有在構造函數中修改
//Test2.b = 3;//error message->錯誤 1 無法對靜態只讀字段賦值(靜態構造函數或變量初始值設定項中除外)
//此方式,通過構造函數(static的)修改
Test2 t2 = new Test2();
Console.WriteLine(t2.getIntValue());
Console.ReadLine();
//下一行代碼是非法的,無法通過編譯,因為InvalidChars的引用無法更改
//Test2.InvalidChars = new Char[] { ''X'', ''Y'', ''Z'' };//error message->錯誤 1 無法對靜態只讀字段賦值(靜態構造函數或變量初始值設定項中除外)
}
}
按F5,輸出結果為2,OK。