C#: const与readonly的用法和区别解析

总结一下const和readonly:

  1. const和readonly的值一旦初始化则都不再可以改写;
  2. const只能在声明时初始化;readonly既可以在声明时初始化也可以在构造器中初始化;
  3. const隐含static,不可以再写static const;readonly则不默认static,如需要可以写static readonly;
  4. const是编译期静态解析的常量(因此其表达式必须在编译时就可以求值);readonly则是运行期动态解析的常量;
  5. const既可用来修饰类中的成员,也可修饰函数体内的局部变量;readonly只可以用于修饰类中的成员.

前面是我从网上摘录的,文字太多,懒得自己再总结和打字了.

注意,第四点尤为重要,我用以下代码来说明和验证:

 

1.建立文本文件,然后改成.cs文件-lib.cs:

  

 

 

2.在命令行中输入: csc /t:library lib.cs,就会生成一个lib.dll文件.

 

3.建立文本文件,然后改成.cs文件-demo.cs:

 

 

 

4.在命令行中输入: csc /r:lib.dll demo.cs,也就会生成一个demo.exe文件.

 

双击,结果如下:

3.14

3.14

 

5.更改lib.cs为:

  

 

 

6.再次双击demo.exe文件,结果却如下:

3.14

3.1415

(注: 直接双击demo.exe是直接运行,不再编译,上结果也就是运行期结束的结果,相当于跳过了编译)

 

原因是什么呢?请听我慢慢道来.

 

用ILDasm工具(这里假定你会用),选择lib.dll,内容如下:

 

双击PI段:

内容为

 

双击pi段:

内容为

 

 

明显lib.cs被编译成元数据和IL汇编时,PI直接被替换成float64(3.1415000000000002)

而.cctor: void()静态构造函数中,

pi是动态分配内存的,直到运行时才调用静态构造函数来初始化pi.

 

如果这时你还是不太明白,让我们接下去看:

用ILDasm工具,选择demo.exe,内容如下:

我们来看看Main函数中我们到底做了些什么:

WriteLine()打印PI时, 

这说明编译时,PI被编译成一个常量.

WriteLine()打印pi时,

这说明编译时,pi被编译成调用ConstReadonly_Base.Test::pi,可见pi量是动态分配和调用的.

 

相信大家都明白了吧!

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值