C#引入了readonly修饰符来表示只读域,const来表示不变常量。顾名思义对只读域不能进行写操作,不变常量不能被修改,这两者到底有什么区别呢?只读域只能在初始化--声明初始化或构造器初始化--的过程中赋值,其他地方不能进行对只读域的赋值操作,否则编译器会报错。只读域可以是实例域也可以是静态域。只读域的类型可以是C#语言的任何类型。但const修饰的常量必须在声明的同时赋值,而且要求编译器能够在编译时期计算出这个确定的值。const修饰的常量为静态变量,不能够为对象所获取。const修饰的值的类型也有限制,它只能为下列类型之一(或能够转换为下列类型的):sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, enum类型, 或引用类型。值得注意的是这里的引用类型,由于除去string类型外,所有的类型出去null值以外在编译时期都不能由编译器计算出他们的确切的值,所以我们能够声明为const的引用类型只能为string或值为null的其他引用类型。显然当我们声明一个null的常量时,我们已经失去了声明的意义--这也可以说是C#设计的尴尬之处!
定义常量时注意:1 常量的值是在编译时设定的,可以由程序员设定,默认状态是编译器设定 2 常量成员的值必须是数值文字
客户代码不需要是理化,因为默认状态下,常量成员是静态的
在运行时才知道,一旦初始化后就不再改变----只读字段
按定义是静态的.在运行的时候才初始化,这个时候需要加上限定符--static和readonly,然后再创建一个特殊类型的构造函数叫做"静态构造函数",静态构造函数是用来初始化静态字段(不管是否只读)的构造函数
static静态成员必须有一个合法的值,如果你没有初始化,那么CLR就会再应用程序启动时使用默认值"0"进行初始化.