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

转载 2016年08月29日 20:03:11

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

很多初学者分不清readonly和const的使用场合。在我看来,要使用const的理由只有一个,那就是效率。但是,在大部分应用情况下,“效率”并没有那么高的地位,所以我更愿意采用readonly,因为readonly赋予代码更多的灵活性。const和readonly的本质区别如下:

const是一个编译期常量,readonly是一个运行时常量。

const只能修饰基元类型、枚举类型或字符串类型,readonly没有限制。

关于第一个区别,因为const是编译期常量,所以它天然就是static的,不能手动再为const增加一个static修饰符,下面的代码将会导致编译通不过:

  1. static const int ConstValue = 100; //常量“ConstValue”不能标记为 static 

而之所以说const变量的效率高,是因为经过编译器编译后,我们在代码中引用const变量的地方会用const变量所对应的实际值来代替,如:

  1. Console.WriteLine(ConstValue); 

和下面的代码生成的IL代码是一致的:

  1. Console.WriteLine(100); 

readonly变量是运行时变量,其赋值行为发生在运行时。readonly的全部意义在于,它在运行时第一次被赋值后将不可以改变。当然,“不可以改变”分为两层意思:

1)对于值类型变量,值本身不可改变(readonly,只读)。

2)对于引用类型变量,引用本身(相当于指针)不可改变。

来看值类型变量,查看如下代码:

  1. class Sample  
  2. {  
  3.     public readonly int ReadOnlyValue ;  
  4.  
  5.     public Sample( int value)  
  6.     {  
  7.         ReadOnlyValue = value;  
  8.     }  

Sample的实例ReadOnlyValue在构造方法中被赋值后就不可以改变,下面的代码将不会编译通过:

  1. Sample sample = new Sample(200);  
  2. sample.ReadOnlyValue = 300;         //无法对只读的字  
  3. //段赋值(构造函数或变量初始值指定项中除外) 

针对引用类型变量,查看如下代码:

  1. class Sample2  
  2. {  
  3.     public readonly Student ReadOnlyValue;  
  4.  
  5.     public Sample2(Student value)  
  6.     {  
  7.         ReadOnlyValue = value;  
  8.     }  

Sample2的ReadOnlyValue是一个引用类型变量,赋值后,变量不能再指向任何其他的Student实例,所以,下面的代码将不会编译通过:

  1. Sample2 sample2 = new Sample2(new Student() { Age = 10 });  
  2. sample2.ReadOnlyValue = new Student() { Age = 20 };  
  3.     //无法对只读的字段赋值(构造函数或变量初始值指定项中除外) 

但是,我们之前已经提到过了,引用本身不可改变,引用所指的实例的值,却是可以改变的,下面的代码将会被允许:
  1. Sample2 sample2 = new Sample2(new Student() { Age = 10 });  
  2. sample2.ReadOnlyValue.Age = 20

readonly所代表的运行时含义有一个重要的作用,就是可以为每个类的实例指定一个readonly的变量。以Sample这个类为例,可以在运行时生成多个实例,而同时,又可以为每个实例生成自己的readonly变量,如下:
  1. Sample sample1 = new Sample(100);  
  2. Sample sample2 = new Sample(200);  
  3. Sample sample3 = new Sample(300); 

这就是readonly变量所代表的运行时含义,也正是readonly变量的灵活之处。

注意 有人说,readonly变量不能被重新赋值是不正确的。下面的代码表明了它可以被改变:

  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         Sample sample = new Sample(200);  
  6.         Console.WriteLine(sample.ReadOnlyValue);  
  7.     }  
  8. }  
  9.  
  10. class Sample  
  11. {  
  12.     public readonly int ReadOnlyValue = 100;  
  13.  
  14.     public Sample(int value)  
  15.     {  
  16.         ReadOnlyValue = value;  
  17.     }  

ReadOnlyValue首先在初始值指定项(也称为初始化器)中被赋值为100,后来,在构造方法中又被赋值为200。实际上,应该把初始化器理解成构造方法的一部分,它其实是一个语法糖。在构造方法内,我们确实可以多次对readonly赋值。

转自:《编写高质量代码改善C#程序的157个建议》陆敏技

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

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

const 与readonly区别

前言:         这个问题我们在平常开发工作中可能不太注意,但在面试官那里可能被经常提及!深入理解他们对我们的开发有很大的指导性.提升程序的性能以及减少出错率! 讲义:         当...
  • softkexin
  • softkexin
  • 2012年04月04日 10:14
  • 2533

浅析C#中const与readonly的区别

在文章《浅析C++中的const(比#define的优势)》中简要分析了const关键字的作用,以及较#define的优势。C#中同样具有关键字const。但是c#中还有一个关键字叫readonly,...
  • wangshubo1989
  • wangshubo1989
  • 2015年09月15日 08:54
  • 1386

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

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

C#——const与readonly的区别

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

const,static和readonly的区别

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

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

C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景。 工作原理     readonly为运行时常量,程序运...
  • High_Mount
  • High_Mount
  • 2011年08月06日 17:26
  • 17013

C# const,readonly,static区别

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

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

区别 const是一个编译期常量,readonly是一个运行时常量。 const只能修饰基元类型,枚举类型和字符串类型,readonly没有限制。 const变量的效率高,是因为经过编译器编译后,...
  • yijunwanghaha
  • yijunwanghaha
  • 2017年05月03日 23:42
  • 161

C#中的readonly跟const用法小结

总结一下常量和只读字段的区别: 一.值的区别: 常量(const):是已知的,不能修改的值。const都是静态的,不能使用static修饰。 只读字段(readonly):不能修改的,只读字段的...
  • u013930409
  • u013930409
  • 2015年05月24日 17:31
  • 2981
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:建议6: 区别readonly和const的使用方法
举报原因:
原因补充:

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