const 还是 static readonly
到底是 const 还是 static readonly
真的一样?
const 和 static readonly 常在程序中用来声明常量,调用方法也没有什么不同,他们真的一样吗?我们可以做个试验。
程序集内的常量
现在我们建立一个程序,里面有一个MyClass的类,分别用const和static readonly定义常量

然后在程序运行时输出

运行程序,输出

把这两个值改一下,再运行


看来没什么问题
跨程序集的常量
现在我们建新建一个类库,创建一个类,同样的内容

在程序中加入对类库的引用,并把这两个常量输出

正常输出

改变这两个值

我们现在Rebuild那个类库(在类库上右键->Rebuild,不要Rebuild程序)

这样做是为了模拟在程序只对有更改的模块进行更新的情境,Rebuild好后,找到程序的生成目录,把新的DLL放进去,替换掉旧的,启动程序。

问题已经出来了,这样的结果不是我们想要的。
一切尽在IL
我们用ildasm打开exe看一下他的Main方法

我们可以看到,用const定义的常量在编译时是直接把值copy过来的,IL中就像对待字面量一样处理(是不是有点像C/C++的宏展开和内联?)而用static readonly定义的“常量”,在IL中就是一个加载成员变量的操作。
到底是 const 还是 static readonly
用const声明的常量,值在编译时计算,然后直接把常量的值嵌入到IL代码中,不会有栈操作,性能很高,也正因为这一点,const后面只能跟常量表达式,而且在跨程序集引用时,如果改变常量的值,则整个程序需要重新编译,看来const不是可以随便乱用的,如果某个值在以后的版本中可能会改变,那就不要用const,避免不必要的麻烦。
用static readonly 声明的并不能叫做常量,应该叫做只读变量,原因是它的值是在运行时进行计算的,因此具有很大的灵活性,它后面不仅仅可以跟常量表达式,还可以跟一个值只有在运行进才能确定的表达式,比如获取系统版本:

如果你追求性能,如果你足够谨慎,请用const,如果你想要灵活,想要安全,请用static readonly。
const 还是 static readonly的更多相关文章
- 到底是 const 还是 static readonly
真的一样? const 和 static readonly 常在程序中用来声明常量,调用方法也没有什么不同,他们真的一样吗?我们可以做个试验. 程序集内的常量 现在我们建立一个程序,里面有一个MyCl ...
- 【转】const和static readonly
我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等.在多数情况下可以混用.二者本质的区别在于,const的值是在编译期间确定的,因此只能在声 ...
- (C#) What is the difference between "const" and "static readonly" ?
const int a must be initialized initialization must be at compile time readonly int a can use defaul ...
- const和static readonly的区别
我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等. 在多数情况下可以混用.二者本质的区别在于,const的值是在编译期间确定的,因此只能在 ...
- C# const和static readonly区别
[转]C# const和static readonly区别 以前只是知道Const和static readonlyd的区别在于const的值是在编译期间确定的,而static readonly是在运行 ...
- Unity C# const与static readonly的区别与联系
using System; namespace Test { class MainClass { //懒人写法的单例 class Weapon { public static readonly Wea ...
- const和static readonly 区别
const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值. 而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值. static readonly ...
- c#中const、static、readonly的区别
1. const与readonly const ,其修饰的字段只能在自身声明时初始化. Readonly 是只读变量,属于运行时变量,可以在类初始化的时候改变它的值.该类型的字段,可以在声明或构造函数 ...
- 读书笔记:const和readonly、static readonly 那些事
C#中表示不变的量(常量)的两种形式:const 和readonly const 是静态常量 readonly 是动态常量 严格的来讲:const 应该称为常量 而readonly 则应称为只读变量. ...
随机推荐
- uva 1500 - Alice and Bob(论证)
option=com_onlinejudge&Itemid=8&page=show_problem&problem=4246" target="_blank ...
- MAC OSX在视图port哪个程序占用,杀死进程的方法
sudo lsof -i :9000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 6 ...
- javascript 实现一个网页,然后计算出有多少剩余时间的倒计时程序
function counter() { var date = new Date(); var year = date.getFullYear(); var date2 = new Date(year ...
- 使用CNN(convolutional neural nets)关键的一点是检测到的面部教程(四):学习率,学习潜能,dropout
第七部分 让 学习率 和 学习潜能 随时间的变化 光训练就花了一个小时的时间.等结果并非一个令人心情愉快的事情.这一部分.我们将讨论将两个技巧结合让网络训练的更快! 直觉上的解决的方法是,開始训练时取 ...
- mac_Alfred_快捷设置
1.安装(不说了去 Google 吧) 2.基础快捷键:option+space 3.打开应用程序:Alfred 几乎是一切程序的入口,你再也不需要找妈妈要开始菜单了.用快捷键呼出Alfred,输入任 ...
- Tomcat剖析(二):一个简单的Servlet服务器
Tomcat剖析(二):一个简单的Servlet服务器 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三) ...
- angularJS之使用过滤器转化输出 (angularJS系列最后一篇)
在视图模板中使用过滤器 过滤器也是一种服务,负责对输入的内容进行处理转换,以便更好地向用户显示. 过滤器可以在模板中的{{}}标记中使用: {{ expression | filter:arg1:ar ...
- 关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义: 在phpcms系统中自己写后台模块,要在前台模板中显示出来须要在\phpcms\modules\自定义 ...
- AutoMapper 创建嵌套对象映射(原创)
之前在做DTO转换时,用到AutoMapper.但DTO的层次太深了,无奈官方没针对嵌套类型提供好的解决方案,于是自己实现了一下: 思路:采用递归和反射很好的避免手工创建嵌套对象的映射. 第一个版本, ...
- OCP-1Z0-051-题目解析-第13题
13. View the Exhibit and examine the structure of the PRODUCTS table. You need to generate a report ...