首页 > 其他 > 详细

const,readonly和static readonly的确切认识

时间:2014-03-07 17:08:47      阅读:463      评论:0      收藏:0      [点我收藏+]

首先呢 ,我们先看一个示例:

bubuko.com,布布扣
 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();
        }
    }
bubuko.com,布布扣


一、基础分析:

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!