C#中表示不变的量(常量)的两种形式:const 和readonly
const 是静态常量
readonly 是动态常量
严格的来讲:const 应该称为常量 而readonly 则应称为只读变量。为什么这么说呢,继续往下看。
使用上的不一样
const 常量在声明时必须初始化
readonly、static readonly 在声明时可以不初始化
readonly 声明的常量通过以下两种方式进行初始化
声明时初始化,构造函数初始化(非静态构造函数)
static readonly 声明的常量通过以下两种方式进行初始化
声明初始化,静态构造函数初始化
const 可以声明字段常量和局部常量
readonly 不能在局部变量中使用
const常量编译后保存于模块的元数据中,无须在托管堆中分配内存
readonly 常量需要分配独立的存储空间
const常量只能是编译器能够识别的基元类型如Int,string,float,char 等
readonly 常量可以是任何类型
const可以定义字段和局部变量 readonly则只能定义字段
数组、结构体不能声明为const常量,因为两者是可变的
容易忽略的地方-const的可能问题
当项目中引用一个dll时,dll中的对象有const常量,但是当修改这个常量后重新编译这个dll,将这个dll覆盖旧的dll,运行exe,会出现const常量的值并未改变
这就是const常量引起的引用程序集不一致的问题
问题的原因就是因为 const 是编译时常量
相对来说, readonly 是运行时常量,所以 const高效,后者灵活,在实际运用中推荐用static readonly 代替const用以解决上述问题。
《你必须知道的.NET》读书笔记