首先呢 ,我们先看一个示例:
class ConstAndReadonly { //声明字段 private const string NAME = "Jiangzj"; private readonly Int32 AGE = 22; private readonly string SEX; private static readonly string PASSWORD = "000000"; //构造函数 public ConstAndReadonly() { AGE = 23; } public ConstAndReadonly(Int32 age, string sex) { AGE = age; SEX = sex; } //静态无参构造函数 static ConstAndReadonly() { PASSWORD = "123456"; } //局部常量定义 public void InlineConst() { const string myDescription = "Hello World"; Console.WriteLine(myDescription); } public static void Main(string[] args) { //访问静态成员 Console.WriteLine(ConstAndReadonly.NAME); Console.WriteLine(ConstAndReadonly.PASSWORD); //访问非静态成员 ConstAndReadonly cr = new ConstAndReadonly(); Console.WriteLine(cr.AGE); Console.WriteLine(cr.SEX); ConstAndReadonly cr2 = new ConstAndReadonly(27,"Man"); Console.WriteLine(cr2.AGE); Console.WriteLine(cr2.SEX); //局部常量 cr.InlineConst(); } }
一、基础分析:
1.const 、redonly 和staitc redonly 定义的常量,指定初始值后(包括在构造函数内指定初始值)将不可更改,可读不可写。
2.const必须在声明时指定初始值;而readonly 和static readonly在声明时可以指定页可以不指定初始值,同事也可以在构造函数内指定初始值,如果同时在声明时和构造函数内都指定了初始值,以构造函数内的为准。
3.const和static readonly定义的常量是静态的,只能由类型直接访问;而readonly定义的常量是非静态的,只能由实例对象访问。
4.static readonly常量,如果在构造函数内指定初始值,则必须是静态无参数构造函数。
5.const可以定义局部常量和字段常量,例如在InlineConst 方法中定义的myDescripiton;而readonly和static readonly不能定义局部常量,只能定义字段常量。实际上,readonly 应该称之为只读字段,因此局限于定义字段;而const才是常量,可以定义字段和常量。
二、本质回归
1.const常量是静态常量,确定于编译时,属于类型级。
2.readonly 为非静态常量,readonly常量确定于运行时,属于对象级。
3.static readonly 常量,确定于运行时,属于对象级。
4.const常量编译后保存于模块的元数据中,无须在托管堆中分配内存,并且const常量只能是编译器能够识别的基元类型,例如Int32,char,string等;而readonly常量需要分配独立的存储空间,并且可以是任何类型。
三、概括总结的规则
1.const默认是静态的,只能由类型来访问,不能和static同时使用;readonly默认是非静态,由实例对象访问,可以显式使用static定义为静态成员。
2.const只能应用在值类型和string类型上,其他引用类型常量只能定义为null,否则以new为const引用常量赋值,编译器会引发“只能用null对引用类型的常量进行初始化”的错误提示,原因是构造函数初始化是在运行时,而非编译时;readonly只读字段,可以是任何类型,但是对于引用类型字段来说,readonly不能限制对该对象实例成员的读写控制。
3.const必须在字段声明时初始化;而readonly可以在声明时,也可以在构造函数中初始化,不同的构造函数可以为readonly常量实现不同的初始值。static readonly字段只能在初始化或者静态构造函数中进行初始化。
4.const可以定义地段和局部变量;而readonly定义时可以不进行初始化,但是微软强烈建议在定义时进行初始化。否则CLR将根据其类型富裕默认值。
5.数组和结构体不能被声明为const常量,string类型可以被声明为常量,其源于string类型的字符串恒定特性,使得string的值具有只读特性。
6.从应用角度来说,对于恒定不变且单独使用的量来说,应该考虑声明为const常量,例如圆周率、性能比、折扣率、百分比等;而对于可能随实际运行发生变化的量,应该考虑声明为readonly常量,例如日期或者时间,数据库中的主键ID.
const,readonly和static readonly的确切认识,布布扣,bubuko.com
const,readonly和static readonly的确切认识
原文:http://www.cnblogs.com/love-huihui-zhupo/p/3584495.html