回顾001-- const和readonly 不得不说的事
回顾点:
Tip1: 常量类型分析;
Tip2:const和readonly对比;
Tip3:const和readonly应用场合以及注意事项。
Tip1====> 常量类型分析
不变的量是程序设计中的平衡剂,是系统中恒定不变的量,.net为此提供了两种方式来实现:const和readonly:const是静态常量,而readonly是动态常量。严格意义上来说,const应该被称为常量,而readonly则应该被称作只读常量。
Tip2====> const和readonly对比
一句话总结二者区别:const变量编译时被赋值,readonly在运行时被赋值。
以下区别均是基于上一句话,
const | readonly | |
初始化 | 定义时必须初始化。如果没有初始化,CLR将根据类型赋予默认值 | 1.定义时初始化(推荐),最晚初始化时间是构造函数中 2.static readonly 变量的赋值在定义时(推荐),最晚赋值时间是静态构造函数中 |
被赋值的类型 | 1.基本数据类型如:byte, byte, short, ushort, int, uint, long, ulong, char, float, double, float, bool, decimal) 2.引用类型只能为string常量或者null 3.不能使用new运算符初始化一个const常量,即使该数据类型为值类型。【注意:array、struct均不能初始化一个const常量】 | 无特殊要求 |
定义范围 | 定义字段常量或者局部常量(即:全局和局部均可以) | 只能被用来定义常量,不能定义局部常量(即:只能是全局) |
本质 | 定义:private const string Name; 通过IL代码查看: st---> private static literal string 由于const常量被编译成了static成员,因此const常量是静态常量,确定于编译时,属于类型级。也就是通过类名直接访问,被所有对象共享! | 1.readonly: private readonly string Name; 通过IL代码查看: readonly--->private initonly string Name, 非静态常量,通过构造函数初始化,确定于运行时,属于对象级,通过对象访问。 2. static readonly: private static readonly string Name; 通过IL代码查看: readonly--->private static initonly string Name 静态常量,通过构造函数初始化,确定于运行时,属于类级,通过类访问。 |
应用场景 | 例如:Math.PI的定义 | 例如:SqlHelper类的连接字符串定义 |
Tip3====>const和readonly应用场合以及注意事项。
1.const可能引发的问题:
用程序集时,const常量将直接被编译到引用程序集中,如果原程序const常量变化,由于const常量值在编译时确定,这将导致引用该程序集的程序必须重新编译,否则依旧使用变更前的值。此时推荐使用static readonly,因为其是运行时赋值,当常量值被更改,运行时也随之更改。
2.是使用只读属性还是只读字段
.net中,关于运行时的只读特性,还有一种方式:只读属性,和readonly只读字段比较起来,只读属性提供了对只读变量更好的封装和灵活性,但使用还是情况而定。例如,常见的sqlhelper类中连接字符串,一般使用readonly来写。
private static readonly string conStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;