C#编程(十五)----------只读字段

时间:2023-03-08 17:41:42
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字段在内存中有存储位置。