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灵活。
引申:效率差得不多的情况下,选灵活的解决问题方式。