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 Main (string[] args)
{
//下面三行代码是合法的,可以通过编译,并可以成功修改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。