readonly和const的区别

readonly和const的区别部分开发者会认为,readonly修饰的变量是不能修改的,在以后的开发中从不对ReadOnly的变量进行修改,形成思维定势,这个观念是错误的。首先要明确一点:更改!=重新分配(赋值)对于简单类型(如int),更改是等于重新赋值,因为默认操作符只有=,但于对于复杂类型,就不一定了。例如:对于集合类型,可以增加、移除、清空内容。例子如下:publicinterfaceIA{}pu…

的确,const与readonly 很像,都是将变量声明为只读,且在变量初始化后就不可改写。那么,const与readonly 这两个修饰符到底区别在什么地方呢?其实,这个牵扯出C#语言中两种不同的常量类型:静态常量(compile-time constants)和动态常量(runtime constants)。这两者具有不同的特性,错误的使用不仅会损失效率,而且还会造成错误。

一、先介绍下const,即常量:

  1. const已经默认是静态类型(即static类型),所以不能再和static一起使用
  2. const是在编译时计算的,不仅必须给予const初始值,它的表达式中还不能包含变量:
    如 const int a= b+1; 这样编译不能通过的
    如 const int b=1; const int a=b+1; 这样是正确的
  3. const在程序运行过程中 ,是不允许被修改的!

二、const修饰的常量是静态常量,静态常量是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值。
举例:

using System;
class P
{
    const int A = B * 10;
    const int B = 10;
    public static void Main(string[] args)
    {
        Console.WriteLine("A is {0},B is {1} ", A, B);
    }
}

输出的结果是:A is 100,B is 10,不是A is 0,B is 10,因为const修饰的A和B都是编译的时候确定的值,编译时是不在乎字段定义的先后顺序的。

三、而readonly修饰的常量是动态常量,动态常量的值则是在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化。
举例:

using System;
class P
{
    static readonly int A = B * 10;
    static readonly int B = 10;
    public static void Main(string[] args)
    {
        Console.WriteLine("A is {0},B is {1} ", A, B);
    }
}

输出的结果是:A is 0,B is 10,不是A is 100,B is 10,因为A和B都是运行的时候确定的值,开始都是默认值,int变量的默认值就是0嘛,运行时是在乎字段定义的先后顺序的。
在这里插入图片描述
上图中的写法就是错误的,因为:运行时在乎先后顺序。

四、ILDASM可以打开上述代码编译后产生的可执行文件:
在这里插入图片描述
五、那么对于静态常量以及动态常量还有什么特性呢? 其实,静态常量只能被声明为简单的数据类型(int以及浮点型)、枚举、布尔或者字符串型,而动态常量则除了这些类型,还可以修饰一些对象类型。如DateTime类型,如下:

//错误
const DateTime time=new DateTime(); 
//正确
static readonly DateTime time=new DateTime();

从上面可以看出,const修饰的值的确不能被修改了,但readonly修饰的值是可以被更改的,具体请见readonly修饰的变量可以修改,只是不能重新分配

另外,readonly常和static一起修饰一个字段,也就可通过“类名.字段名”来调用该静态只读字段。
static readonly常量只能声明在类中;而const常量既可以声明在类中也可以在函数体内。
六、总结:
在这里插入图片描述

参考

const 与 readonly知多少

今天的文章readonly和const的区别分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23912.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注