真的一样?

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的更多相关文章

  1. const 还是 static readonly

    到底是 const 还是 static readonly   真的一样? const 和 static readonly 常在程序中用来声明常量,调用方法也没有什么不同,他们真的一样吗?我们可以做个试 ...

  2. 【转】const和static readonly

    我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等.在多数情况下可以混用.二者本质的区别在于,const的值是在编译期间确定的,因此只能在声 ...

  3. (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 ...

  4. const和static readonly的区别

    我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等. 在多数情况下可以混用.二者本质的区别在于,const的值是在编译期间确定的,因此只能在 ...

  5. C# const和static readonly区别

    [转]C# const和static readonly区别 以前只是知道Const和static readonlyd的区别在于const的值是在编译期间确定的,而static readonly是在运行 ...

  6. Unity C# const与static readonly的区别与联系

    using System; namespace Test { class MainClass { //懒人写法的单例 class Weapon { public static readonly Wea ...

  7. const和static readonly 区别

    const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值. 而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值. static readonly ...

  8. c#中const、static、readonly的区别

    1. const与readonly const ,其修饰的字段只能在自身声明时初始化. Readonly 是只读变量,属于运行时变量,可以在类初始化的时候改变它的值.该类型的字段,可以在声明或构造函数 ...

  9. 读书笔记:const和readonly、static readonly 那些事

    C#中表示不变的量(常量)的两种形式:const 和readonly const 是静态常量 readonly 是动态常量 严格的来讲:const 应该称为常量 而readonly 则应称为只读变量. ...

随机推荐

  1. 2016.02.17 JS DOM编程艺术 第四五六章

    看完这三章内容,集中精力,加快速度.

  2. ide编辑器

    http://wowubuntu.com/markdown/#editor https://netbeans.org/downloads/start.html?platform=windows& ...

  3. Java制作证书的工具keytool用法总结

    一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...

  4. 清除SQLServer日志的两种方法

    日志文件满而造成SQL数据库无法写入文件时,可用两种方法:一种方法:清空日志.1.打开查询分析器,输入命令DUMP TRANSACTION 数据库名 WITH NO_LOG2.再打开企业管理器--右键 ...

  5. javascript arguments与javascript函数重载

    1.所 有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数.他不是一个数组,如果用typeof arguments,返回的是’object’.虽然我们可以用调用数据的方法来调用 ...

  6. RecycleView在eclipse的初体验

    在sdk中找到v7包 \sdk\extras\android\support\v7\recyclerview 导入工程 Import\Android\Existing Android Code Int ...

  7. [Linux]CentOS下安装和使用tmux

    前天随意点开博客园,看到了一篇关于tmux的文章 Tmux - Linux从业者必备利器,特意还点进去看了.毕竟Linux对于做游戏服务端开发的我来说,太熟悉不过了.不过我就粗略地看了一眼,就关掉了. ...

  8. JQuery教程

    1.是javaScript库(js文件) 2.使用:script标签 3.语法:$开头 $().action() 列如:$('div').css("color",'red'); 4 ...

  9. Hibernate框架—简介

    ORM对象/关系数据库映射 ORM全称Object/Relation Mapping,对象/关系数据库映射,可以理解成一种规范.该框架的基本特征:完成面向对象的编程语言到关系数据库之间的映射. ORM ...

  10. linux用户、组管理及权限(一)

    一.用户管理 1.为什么需要用户 1)计算机及网络资源的合理分配  2)可以控制用户访问系统的权限.3)身份认证 4) 进程 以某个用户的身份来运行 2.用户分类 用户的角色是通过UID(用户ID)来 ...