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

  1. 到底是 const 还是 static readonly

    真的一样? const 和 static readonly 常在程序中用来声明常量,调用方法也没有什么不同,他们真的一样吗?我们可以做个试验. 程序集内的常量 现在我们建立一个程序,里面有一个MyCl ...

  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. ABP领域层——仓储(Repositories)

    ABP领域层——仓储(Repositories) 点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之11.ABP领域层——仓储(Repositories) ABP是 ...

  2. IC设计前端到后端的流程和eda工具。

    IC前端设计(逻辑设计)和后端设计(物理设计)的区分:以设计是否与工艺有关来区分二者:从设计程度上来讲,前端设计的结果就是得到了芯片的门级网表电路. 前端设计的流程及使用的EDA工具例如以下: 1.架 ...

  3. VC中MessageBox的常见用法

    一.关于MessageBox       消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.       1.MessageBox("这是一个最简单的 ...

  4. 基于Js实现的UrlEncode和UrlDecode函数代码

    <script language="javascript">//UrlEncode函数function UrlEncode(str){  var ret="& ...

  5. 使用Blend的一些问题

    原文:使用Blend的一些问题 WPF开发,界面处理首选Blend,如果你开发了两年WPF都没接触过blend(当然这种几率不高),或者你刚接触WPF,可以考虑使用Blend,这货也算得上一个神器,上 ...

  6. php_中替换换行符

    //php 有三种方法来解决 //1.使用str_replace 来替换换行 $str = str_replace(array("\r\n", "\r", &q ...

  7. ScrollView 嵌套ListView 幻灯冲突,和显示不全

    import android.content.Context; import android.util.AttributeSet; import android.widget.ListView; /* ...

  8. 【百度地图API】如何获取行政区域的边界?

    原文:[百度地图API]如何获取行政区域的边界? 摘要:以前教过大家如何自行获取行政区域,或者自定义获取一个区域的边界值.今天来教大家直接调用百度地图API1.3(目前最新版本)来获取行政区域的边界值 ...

  9. Redhat Enterprise server 6.3 构造VPN

    一.软体 dkms.kernel_ppp_mppe.pptpd 二.下载软件 wget http://sourceforge.net/projects/poptop/files/mppe%20modu ...

  10. 找不到方法: Int32 System.Environment.get_CurrentManagedThreadId() .

    这个问题在本地运行没错...放到服务器上就出现这个问题.. 原因:是这个方法是.NETFRAMWORK4.5的..服务器上用的是4.0就会出现这个问题. 解决办法:在本地WEB项目右键把项目改到FRA ...