[高效编程读书笔记]用readonly而不是const
Readonly和Const在初值定下来之后都只读不可写。
Readonly是“只读变量”,Const才是“真常量”。
Const的值是在编译时内联到引用程序集当中,也就是写死了,如果程序集A引用了含有Const常量的程序集B,那么程序集A看到的Const常量就是一个固定的值,如果这个值变了,那么程序集B中的新值要重新编译一遍才能被A识别。而使用Readonly的话,值是运行时确定的,就是说程序集A在程序集B中动态获取了一把。
比较:
const |
static readonly |
readonly |
|
初始化的时机 |
声明时 |
声明时或构造函数 |
声明时或构造函数 |
值确定的时机 |
编译时 |
运行时 |
运行时 |
可定义的位置 |
字段或函数内的局部常量 |
只能定义为类中的字段常量 |
只能定义为类中的字段常量 |
初始化的位置 |
类字段 |
类字段或静态无参构造函数 |
类字段或构造函数 |
值存储的位置 |
模块元数据 |
托管堆 |
托管堆 |
可指定类型 |
基本类型和string |
任意类型 |
任意类型 |
访问权限 |
静态的,只能由类访问 |
静态的,只能由类访问 |
非静态的,可以由对象访问 |
IL本质 |
static literal(静态字面的) |
static initonly(静态只可初始化的) |
initonly(只可初始化的) |
注:如果在多处定义了只读变量的初始值,则以构造函数里的为准(运行时)。
结论: Const高效,Static Readonly折中,Readonly灵活。
引申:效率差得不多的情况下,选灵活的解决问题方式。