常量
常量是不可变的值,在编译时是已知的,在程序的生命周期内不会改变。常量使用const修饰符声明。只有 C# 内置类型(int,float)可声明为 const。 除 String 以外的引用类型常量只能使用 null 值进行初始化,所以对于引用类型的常量值唯一可能是字符串和 null 引用。用户定义类型(包括类,结构,数组)不能使用const声明。
- 常量在声明时必须初始化。
- 常量是作为静态字段访问的,因为常量的值对于该类型的所有实例都是相同的。不允许使用static修饰符。
- 常量可以参与常量表达式。
const关键字
使用 const 关键字来声明常量(可作为静态字段访问)。
readonly关键字
readonly关键字是一个可以在五个上下文中使用的修饰符,这里只说在字段声明中的作用。
readonly修饰的字段只能在声明期间或在同一个类的构造函数中赋值。在构造函数中可以多次和重新分配readonly字段。
构造函数退出后不能为readonly字段做赋值操作。此规则对于值类型和引用类型具有不同的含义:
- 由于值类型直接包含数据,因此属于 readonly 值类型的字段不可变。
- 由于引用类型包含对其数据的引用,因此属于 readonly 引用类型的字段必须始终引用同一对象。 该对象可能是可变的。 readonly 修饰符可防止将字段值替换为引用类型的其他实例。 但是,修饰符不会阻止通过只读字段修改字段的实例数据。
示例图:
readonly声明的字段不能够作为静态字段访问;必须显示声明。
readonly关键字与const关键字
readonly 关键字不同于 const 关键字。 const 字段只能在该字段的声明中初始化。 readonly字段可以在字段声明和任何构造函数中多次分配。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。 另外,虽然 const 字段是编译时常量,但 readonly 字段可用于运行时常量:
public static readonly uint a1 = (uint)datetime.now.ticks;