C#--静态常量const和动态常量readonly
const 静态常量
常量是不可变的值,在编译时是已知的,在程序的生命周期内不会改变。常量使用const修饰符声明。只有 C# 内置类型(int,float)可声明为 const。 除 String 以外的引用类型常量只能使用 null 值进行初始化,所以对于引用类型的常量值唯一可能是字符串和 null 引用。用户定义类型(包括类,结构,数组)不能使用const声明。
- 常量在声明时必须初始化。
- 常量是作为静态字段访问的,因为常量的值对于该类型的所有实例都是相同的。不允许使用static修饰符。
- 常量可以参与常量表达式。
const关键字
使用 const 关键字来声明常量(可作为静态字段访问)。
readonly动态常量
将readonly关键字作为修饰符的地方:
- 字段声明中
- readonly struct在类型定义中
- 在结构类型中的实例成员声明中
- ref readonly在方法返回中
这里只说在字段声明中的作用。
readonly修饰的字段只能在声明期间或在同一个类的构造函数中赋值。在构造函数中可以多次和重新分配readonly字段。
构造函数退出后不能为readonly字段做赋值操作。此规则对于值类型和引用类型具有不同的含义:
- 由于值类型直接包含数据,因此属于 readonly 值类型的字段不可变。
- 由于引用类型包含对其数据的引用,因此属于 readonly 引用类型的字段必须始终引用同一对象。 该对象可能是可变的。 readonly 修饰符可防止将字段值替换为引用类型的其他实例。 但是,修饰符不会阻止通过只读字段修改字段的实例数据。
示例图:
readonly声明的字段不能够作为静态字段访问;必须显示声明。
const 静态常量 和 readonly 动态常量 的区别
const
- 用于声明编译时常量,这意味着它的值必须在编译时就确定,并且在声明时就必须初始化。
- 常量的值在编译期间被解析,编译器会将所有对该常量的引用替换为其值。
- 变量默认是静态的,无法通过实例访问,只能通过类名访问。
- 可以在类中或方法体内声明,但它的数据类型受限,只能是基本数据类型、枚举、字符串或 null 引用类型。
readonly
- 用于声明运行时常量,它的值可以在构造函数中设置,因此可以在运行时确定。
- 字段可以在声明时或在任何构造函数中初始化,但一旦构造函数执行完毕,它的值就不能再改变。
- 字段不是静态的,除非显式地使用 static 关键字声明。如果将 readonly 设置为静态,则必须在类级别声明。
- 字段可以是任何类型,包括用户定义的类型。
public static readonly uint a1 = (uint)datetime.now.ticks;