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的区别

文章1: 我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。在多数情况下可以混用。二者本质的区别在于,const的值是在编译期间确定的,因...
  • shineHoo
  • shineHoo
  • 2010年01月26日 09:52
  • 6977

C#中const与readonly的区别之浅见

之前在写C#代码时一直没有认真思考过const与readonly的区别,都是用的比较随意,只知道说这两个关键字一个是不变常量并且无法修改,一个是只读不能进行写操作。然后看过一些文章之后觉得之前理解的太...
  • andyqingliu
  • andyqingliu
  • 2017年01月11日 17:32
  • 3684

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

总结一下const和readonly:const和readonly的值一旦初始化则都不再可以改写; const只能在声明时初始化;readonly既可以在声明时初始化也可以在构造器中初始化; cons...
  • xiaofengsheng
  • xiaofengsheng
  • 2009年10月12日 19:51
  • 4563

建议6: 区别readonly和const的使用方法

建议6: 区别readonly和const的使用方法 很多初学者分不清readonly和const的使用场合。在我看来,要使用const的理由只有一个,那就是效率。但是,在大部分应用情况下,“效率”...
  • houwc
  • houwc
  • 2016年08月29日 20:03
  • 427

const,static和readonly的区别

在第四节中,我介绍了常量的定义,其关键字就是const。在定义常量时,必须赋予其初始值。一旦赋予了初始值后,就不能修改其值。也就是所谓的常量值不能更改的含义。由于C#是一门纯粹的面向对象语言,并不存在...
  • azhexg
  • azhexg
  • 2010年10月12日 14:51
  • 2109

C#中的readonly跟const用法小结

总结一下常量和只读字段的区别: 一.值的区别: 常量(const):是已知的,不能修改的值。const都是静态的,不能使用static修饰。 只读字段(readonly):不能修改的,只读字段的...
  • u013930409
  • u013930409
  • 2015年05月24日 17:31
  • 2989

C# const,readonly,static区别

const: (1)可以定义const常量,具有不可变性。   例如:const int Max=100; Max++会产生错误;   (2)便于进行类型检查,使编译器对处理内容有...
  • u013553804
  • u013553804
  • 2016年05月02日 23:29
  • 1165

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

[csharp] view plaincopy  C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适...
  • zhangsu_
  • zhangsu_
  • 2014年03月16日 15:23
  • 3707

C#:readonly和const用法小结

我们都知道,使用const关键字可以将字段或局部变量声明为常量,其不能被修改。 readonly关键字被用来声明只读字段,主要用于字段。 两者有一定的相似性,但是也有明显的差异性,所以本文将两者结合在...
  • tiana0
  • tiana0
  • 2013年09月08日 18:15
  • 2743

const 常量与Readonly的区别

const 常量与Readonly的区别 public class Test { //const是不变常量,在编译的时候就需要有确定的值,只能用于数值和字符串,或者引用类型只能为null...
  • Fanbin168
  • Fanbin168
  • 2017年10月07日 14:17
  • 165
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:readonly 和 const 的误区
举报原因:
原因补充:

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