readonly 和 const 的误区

原创 2016年06月01日 08:55:43

readonly和const都用来定义只读变量,但是readonly属于动态常量,const属于静态常量:

<span style="color:#3366ff;">动态常量:在运行时获取常量的值,并赋值到每个引用的位置;
静态常量:在编译时会把每个引用该常量的位置,全部替换成设定的值 -- 如果有c语言基础,一定可以理解这一点</span>

所以静态常量在定义的时候必须初始化,且不能再修改,因为项目一旦开始编译,静态常量的值就会被获取,并替换项目中所有引用该常量的位置;

但是动态变量是可以延时到构造函数再初始化(当然在定义的时候也可以直接初始化),且不能再修改。


上面简单做了描述,如果不能理解,那么我们通过一个例子来解释一下:


public class Test{
    public static readonly int A=10;
    public const int B=20;
}

public class Runner{
      public void Run(){
             int num_a=Test.A;
             int num_b=Test.B;
       }
}

如上代码,编译后:

class Test{
    .field public static initonly int32 A; -- 并未赋值
    .field public static literal int32 B=int32(0x00000014); -- 已经被赋值
}

代码中出现Test.B的位置,会全部被替换成20,所以在运行的时候,性能会比较好;

代码中出现Test.A的位置,依然是Test.A,所以运行的时候,内存中需要记录Test.A的值,每当运行到Test.A调用时,就到内存中读取该值,所以性能次之;


经常出现的问题:

在一个项目A中,定义了一个静态常量 const SOMETHING=VALUE; 在另一个项目B中做了引用,但后期因各种需求,需要变更项目A中常量的值,并对项目A重新编译后部署,但此时并没有重新编译项目B,所以导致项目B运行时,仍然是过期的常量值。


了解它们的区别,才能更合理的使用它们:

readonly:有内存消耗;可以是任意类型(包括自定义的类型);可以在定义时或构造函数中初始化;

const:无内存消耗;只能是基元类型;只能在定义时初始化;


版权声明:本文为博主原创文章,未经博主允许不得转载,如转载请注明出处。

相关文章推荐

c#中const与readonly区别

  • 2013年11月14日 09:34
  • 997B
  • 下载

.net中const和readonly使用

  • 2011年06月13日 11:18
  • 2KB
  • 下载

const,readonly 常量与只读

Const是常量 Const在编译时会被编译为静态成员,它确定于编译时期,属类型级,通过类型来访问。 现在通过以下几种情况来说明const常量: (1)初始化 public const s...

C#编程中 readonly与const的区别

  • 2010年04月06日 16:57
  • 149KB
  • 下载

const和readonly二者区别

1.1 静态/动态常量  首先先解释下什么是静态常量以及什么是动态常量。静态常量是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值。而动态常量的值则是在运行的那一刻才获得的,编译...

const和static readonly 区别

本博客转载于:http://www.cnblogs.com/cuihongyu3503319/archive/2009/02/23/1396653.html 我们都知道,const和...

C#中的static、readonly与const的比较

[csharp] view plaincopy  C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比...

const readonly的区别

在C#中const 和 readonly都是常量的修饰符,那么两者有什么区别? class Test{ const int num = 5; readonly int num2=5; ...

【C#】const和readonly的区别

最主要的区别是readonly是动态的而const是静态的,一个运行时确定,一个编译时确定。原文链接: http://www.cnblogs.com/zcy_soft/archive/2010/10/...

C# readonly与const的区别

概述const修饰的常量是在编译时便被计算出确定的值,并代换到引用该常量的每一个地方,而readonly时在运行时才确定的量–只是在初始化后我们不希望它的值再改变。细节C#引入了readonly修饰符...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:readonly 和 const 的误区
举报原因:
原因补充:

(最多只允许输入30个字)