回顾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;
posted @ 2013-04-21 16:15  daxiaxj  阅读(146)  评论(0编辑  收藏  举报