`
sangei
  • 浏览: 329040 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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

阅读更多
  1.  C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景。  
  2. 工作原理  
  3.     readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量。  
  4.     const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值。  
  5.     下面声明两个常量:  
  6.   
  7. public static readonly int A = 2; //A为运行时常量  
  8. public const int B = 3; //B为编译时常量  
  9. 下面的表达式:  
  10.   
  11. int C = A + B;  
  12. 经过编译后与下面的形式等价:  
  13.   
  14. int C = A + 3;  
  15. 可以看到,其中的const常量B被替换成字面量3,而readonly常量A则保持引用方式。  
  16. 声明及初始化  
  17.     readonly常量只能声明为类字段,支持实例类型或静态类型,可以在声明的同时初始化或者在构造函数中进行初始化,初始化完成后便无法更改。  
  18.     const常量除了可以声明为类字段之外,还可以声明为方法中的局部常量,默认为静态类型(无需用static修饰,否则将导致编译错误),但必须在声明的同时完成初始化。  
  19.   
  20. 数据类型支持  
  21.     由于const常量在编译时将被替换为字面量,使得其取值类型受到了一定限制。const常量只能被赋予数字(整数、浮点数)、字符串以及枚举类型。下面的代码无法通过编译:  
  22.   
  23. public const DateTime D = DateTime.MinValue;  
  24. 改成readonly就可以正常编译:  
  25.   
  26. public readonly DateTime D = DateTime.MinValue;  
  27. 可维护性  
  28.     readonly以引用方式进行工作,某个常量更新后,所有引用该常量的地方均能得到更新后的值。  
  29.     const的情况要稍稍复杂些,特别是跨程序集调用:  
  30.   
  31. public class Class1  
  32. {  
  33.     public static readonly int A = 2; //A为运行时常量  
  34.     public const int B = 3; //B为编译时常量  
  35. }  
  36.   
  37. public class Class2  
  38. {  
  39.     public static int C = Class1.A + Class1.B; //变量C的值为A、B之和   
  40. }  
  41.   
  42. Console.WriteLine(Class2.C); //输出"5"  
  43. 假设Class1与Class2位于两个不同的程序集,现在更改Class1中的常量值:  
  44.   
  45. public class Class1  
  46. {  
  47.     public static readonly int A = 4; //A为运行时常量  
  48.     public const int B = 5; //B为编译时常量  
  49. }  
  50.  编译Class1并部署(注意:这时并没有重新编译Class2),再次查看变量C的值:  
  51.   
  52. Console.WriteLine(Class2.C); //输出"7"  
  53. 结果可能有点出乎意料,让我们来仔细观察变量C的赋值表达式:  
  54.   
  55. public static int C = Class1.A + Class1.B;  
  56. 编译后与下面的形式等价:   
  57.   
  58.    
  59.   
  60. public static int C = Class1.A + 3;  
  61.      因此不管常量B的值如何变,对最终结果都不会产生影响。虽说重新编译Class2即可解决这个问题,但至少让我们看到了const可能带来的维护问题。  
  62.   
  63. 性能比较  
  64.     const直接以字面量形式参与运算,性能要略高于readonly,但对于一般应用而言,这种性能上的差别可以说是微乎其微。  
  65.   
  66. 适用场景  
  67.     在下面两种情况下:  
  68.     a.取值永久不变(比如圆周率、一天包含的小时数、地球的半径等)  
  69.     b.对程序性能要求非常苛刻  
  70.     可以使用const常量,除此之外的其他情况都应该优先采用readonly常量。
分享到:
评论

相关推荐

    C#中const 和 readonly 修饰符的用法详解

    1. 只有C#内置类型(int,double,long等)可以声明为const;结果、类和数组不能声明为const。 2. readonly 是在字段上使用的修饰符,直接以类名.字段访问。 3. const 必须在申明中初始化。之后不能再修改。 4. ...

    C#程序设计-3期(KC008) KC008110100018-怎样区别const, static和readonly?.docx

    C#程序设计-3期(KC008) KC008110100018-怎样区别const, static和readonly?.docx 学习资料 复习资料 教学资源

    C#基础:基于const与readonly的深入研究

    •readonly和const都是用来标识常量的[1]。•const可用于修饰class的field或者一个局部变量(local variable);而readonly仅仅用于修饰class的field。•const常量的值必定在编译时就已明确并且恒定的;而readonly...

    C# 定义常量 两种实现方法

    在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用“readonly”来定义。 对于静态常量(Compile-time constant),...

    c#基础学习问答c#基础学习问答

    2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 overload 的区别? 8.什么是索引指示器? 9.new ...

    调高C#编程的50个基本技巧

    在 readonly 和 const 之间,优先使用 readonly 3.在 as 和 强制类型转换之间,优先使用 as 操作符 4.使用条件属性 (Conditional Attributes) 来代替条件编译语句 #if 5.总是为自定义类重载 ToString 方法 6...

    在一小时内学会 C#(txt版本)

    C# 中所有内容都打包在类中,而所有的类又打包在命名空间中(正如文件存与文件夹中)。和 C++ 一样,有一个主函数作为你程序的入口点。C++ 的主函数名为 main,而 C# 中是大写 M 打头的 Main。 类块或结构定义之后...

    C#中常量和只读变量的区别小结

    您可能感兴趣的文章:C#学习笔记整理_变量等基础语法(必看篇)C#把整个文件内容读入字符串变量的方法C#中static静态变量的用法实例C#不同类型的成员变量(字段)的默认值介绍C#类中属性与成员变量的使用小结C#中属性和...

    你必须知道的C#的25个基础概念(附源码)

    2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 overload 的区别? 8.什么是索引指示器? 9.new ...

    Effective C# (Covers C# 4.0) Mar 2010

    Item 2: Prefer readonly to const 8 Item 3: Prefer the is or as Operators to Casts 12 Item 4: Use Conditional Attributes Instead of #if 20 Item 5: Always Provide ToString() 28 Item 6: Understand the ...

    C#基础概念.doc

    2、const 和 static readonly 区别? 3、extern 是什么意思? 4、abstract 是什么意思? 5、internal 修饰符起什么作用? 6、sealed 修饰符是干什么的? 7、override 和 overload 的区别? 9、new 修饰符是起什么...

    C#25个问题 静态成员和非静态成员的区别等等

    2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 overload 的区别? 8.什么是索引指示器? 9.new ...

    c#学习笔记.txt

    在 C# 中,类与结构在语义上是不同的。结构是值类型,而类是引用类型。 2, 装箱和拆箱(取消装箱) 装箱是值类型到 object 类型或到该值类型所实现的任何接口类型的隐式转换。将一个值的值装箱会分配一个对象实例并将...

    提高C#编程水平的50个要点

    在 readonly 和 const 之间,优先使用 readonly  3.在 as 和 强制类型转换之间,优先使用 as 操作符  4.使用条件属性 (Conditional Attributes) 来代替条件编译语句 #if  5.总是为自定义类重载 ToString 方法  6...

    C#基础概念二十五问

    2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 overload 的区别? 8.什么是索引指示器? 9.new ...

    C#面向对象 基础概念25

    静态成员和非静态成员的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal 修饰符起什么作用?6.sealed 修饰符是干什么的?7.override 和 overload 的区别

    你必须知道的C#的25个基础概念

    2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 overload 的区别? 8.什么是索引指示器? ......

    C#的25个问题(内附代码示例)

    2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 overload 的区别? 8.什么是索引指示器? 9.new ...

    c#学习笔记——学习心得

    C#中的各种名词: 常数:声明时用const修饰,是隐式静态类型 域:一个代表和某对象或类相关的变量的成员 字段:和属性相同,是用来存储对象的值,可以直接访问数据且不能对数据添加任何限制,但是属性不能且可以对...

Global site tag (gtag.js) - Google Analytics