的确,const与readonly 很像,都是将变量声明为只读,且在变量初始化后就不可改写。那么,const与readonly 这两个修饰符到底区别在什么地方呢?其实,这个牵扯出C#语言中两种不同的常量类型:静态常量(compile-time constants)和动态常量(runtime constants)。这两者具有不同的特性,错误的使用不仅会损失效率,而且还会造成错误。
一、先介绍下const,即常量:
- const已经默认是静态类型(即static类型),所以不能再和static一起使用
- const是在编译时计算的,不仅必须给予const初始值,它的表达式中还不能包含变量:
如 const int a= b+1; 这样编译不能通过的
如 const int b=1; const int a=b+1; 这样是正确的 - 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常量既可以声明在类中也可以在函数体内。
六、总结:
参考
今天的文章readonly和const的区别分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/23912.html