C# 关键字const与readonly的区别
2017-01-12 14:31
513 查看
尽管你写了很多年的C#的代码,但是可能当别人问到你const与readonly的区别时候,还是会小小的愣一会吧~
笔者也是在看欧立奇版的《.Net 程序员面试宝典》的时候,才发现自己长久以来竟然在弄不清出两者的情况下,混用了这么长的时间。的确,const与readonly 很像,都是将变量声明为只读,且在变量初始化后就不可改写。那么,const与readonly 这两个修饰符到底区别在什么地方呢?其实,这个牵扯出C#语言中两种不同的常量类型:静态常量(compile-time constants)和动态常量(runtime constants)。这两者具有不同的特性,错误的使用不仅会损失效率,而且还会造成错误。
首先先解释下什么是静态常量以及什么是动态常量。静态常量是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值。而动态常量的值则是在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化。
当你大致了解上面的两个概念的时候,那么就可以来说明const与readonly了。const修饰的常量是上述中的第一种,即静态常量;而readonly则是第二种,即动态常量。那么区别可以通过静态常量与动态常量的特性来说明:
1)const修饰的常量在声明的时候必须初始化;readonly修饰的常量则可以延迟到构造函数初始化
2)const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值;readonly修饰的常量则延迟到运行的时候
此外const常量既可以声明在类中也可以在函数体内,但是static readonly常量只能声明在类中。
笔者也是在看欧立奇版的《.Net 程序员面试宝典》的时候,才发现自己长久以来竟然在弄不清出两者的情况下,混用了这么长的时间。的确,const与readonly 很像,都是将变量声明为只读,且在变量初始化后就不可改写。那么,const与readonly 这两个修饰符到底区别在什么地方呢?其实,这个牵扯出C#语言中两种不同的常量类型:静态常量(compile-time constants)和动态常量(runtime constants)。这两者具有不同的特性,错误的使用不仅会损失效率,而且还会造成错误。
首先先解释下什么是静态常量以及什么是动态常量。静态常量是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值。而动态常量的值则是在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化。
当你大致了解上面的两个概念的时候,那么就可以来说明const与readonly了。const修饰的常量是上述中的第一种,即静态常量;而readonly则是第二种,即动态常量。那么区别可以通过静态常量与动态常量的特性来说明:
1)const修饰的常量在声明的时候必须初始化;readonly修饰的常量则可以延迟到构造函数初始化
2)const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值;readonly修饰的常量则延迟到运行的时候
此外const常量既可以声明在类中也可以在函数体内,但是static readonly常量只能声明在类中。
class Program { static void Main(string[] args) { Test test = new Test(); //构造方法只运行一次(因为是静态构造函数) Test test2 = new Test(); Console.WriteLine("结束-----"); } public class Test { static readonly int A = B * 10; static readonly int B = 10; static readonly int A1 = 10; static readonly int B1 = A1 * 10; const int C = D * 10; const int D = 10; const int C1 = 10; const int D1 = 10 * C1; static Test() { Console.WriteLine("A is {0},B is {1} ", A, B); //A is 0,B is 10 Console.WriteLine("A1 is {0},B1 is {1} ", A1, B1); //A1 is 10,B1 is 100 Console.WriteLine("C is {0},D is {1} ", C, D); //C is 100,D is 10 Console.WriteLine("C1 is {0},D1 is {1} ", C1, D1); //C is 10,D is 100 } } }
相关文章推荐
- C#中readonly关键字与const关键字的区别(转)
- C#中readonly关键字与const关键字的区别
- C#中readonly关键字与const关键字的区别
- C#中readonly关键字与const关键字的区别
- [转] C#中readonly和const关键字的含义和区别
- Java与C#的中只读关键字区别分析:Java的Final和C#的Const,Readonly
- Java与C#的中只读关键字区别分析:Java的Final和C#的Const,Readonly(原创)
- C# 中使用readonly关键字和const的区别
- C#中const与readonly字段的区别
- C#中 const 和 readonly 的区别
- C#中的readonly与const 的区别
- C#中 const 和 readonly 的区别
- Java5.0与C#2.0的区别之二:Final,Const和Readonly
- C# 的readonly和const区别
- [转]C#中 const 和 readonly 的区别
- readonly和const区别(C#)
- C#中的readonly(运行时常量)与const(编译时常量)的区别
- c# 继承 和 关键字:abstract,const,override,readonly,static,virtual,base,this
- C#中 const 和 readonly 的区别
- C# const和readonly的区别(收藏于网络)