`

【转】C# static const和readonly区别

    博客分类:
  • c#
阅读更多
  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#中的static 和Java中的static

简单,两者用法完全是一致的。从两方面讨论:

1. 变量是属于类的,不是实例级别的。只能通过类名调用,不能通过实例调用。

2. 如果在定义时就赋值了,那么在类初始化的时候,最先完成所有静态变量的赋值。但是要注意,所有静态变量的初始化顺序是无法确定的。

 

C# 中的const 和Java中的finnal

很长一段时间我一直认为两者是相同的作用,无非是变量初始化后不能更改,即只能在定义时或者构造函数中赋值。然而这仅仅只是片面的,下面将为大家详细分析:

1.修饰变量

准确的说C#中的const 等价于 Java中的static final,也就是说,Java中final不具有static的功能。而C#中的const具有static的功能。因此在C#中 public static const string 等将于 public const string。

2.修饰类和方法

此时Java中的final类似C#中的sealed,就是说,final修饰的类不能被继承,final修饰的方法不能被覆盖。

而C#中的const不能修饰类和方法。

问题:

1. 私有静态成员的作用(private static 变量)

字面表示私有的,类外不能使用;静态的,全局变量。看上去很矛盾,又不能被类外使用,要全局的有什么用。问得好,类中全局也是很有意义的,例如 private static int a = 5,那么就可以保证变量a在类的初始化过程中将被优先初始化(在构造函数执行之前)。这样如果对象A的初始化需要对象B的实例,那么就可以用这种申明,以保证在类A在构造函数中能够使用类B的实例。同时private又能够保证类B的实例只能在类A中使用,起到很好的密封作用。

2. 私有最终成员作用(private final 变量)

在类构造函数完成前必须对该成员完成初始化,一旦定义不许更改;该成员只能在本类中使用。实例,子类中都不能使用。

private static final修饰的成员在申明的时就被赋值,保证在构造函数中可以被使用,一个被private static final修饰的成员通常表示其他组件的一个实例,且变量是类中的全局变量。

private final         修饰的成员在构造中被赋值,表示它是该类全局的私有成员变量,且该类的构造需要传入他们的初始值,才能完成类的初始化。


 

C# const和static readonly区别

const: 用const修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序 
static readonly: 用static readonly修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化。

C# const和static readonly区别示例:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.    
  5. namespace Example02Lib  
  6. {  
  7. public class Class1  
  8. {  
  9. public const String strConst = "Const";  
  10. public static readonly String strStaticReadonly = "StaticReadonly";  
  11. //public const String strConst = "Const Changed";  
  12. //public static readonly String strStaticReadonly = "StaticReadonly Changed";  
  13. }  

客户端代码:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using Example02Lib;   
  5. namespace Example02  
  6. {  
  7. class Program  
  8. {  
  9. static void Main(string[] args)  
  10. {  
  11. //修改Example02中Class1的strConst初始值后,只编译Example02Lib项目  
  12. //然后到资源管理器里把新编译的Example02Lib.dll拷贝Example02.exe所在的目录, 执行Example02.exe  
  13. //切不可在IDE里直接调试运行因为这会重新编译整个解决方案!!   
  14. //可以看到strConst的输出没有改变,而strStaticReadonly的输出已经改变  
  15. //表明Const变量是在编译期初始化并嵌入到客户端程序,而StaticReadonly是在运行时初始化的  
  16. Console.WriteLine("strConst : {0}", Class1.strConst);  
  17. Console.WriteLine("strStaticReadonly : {0}", Class1.strStaticReadonly);   
  18. Console.ReadLine();  
  19. }  
  20. }  

修改后的示例:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.    
  5. namespace Example02Lib  
  6. {  
  7. public class Class1  
  8. {  
  9. //public const String strConst = "Const";  
  10. //public static readonly String strStaticReadonly = "StaticReadonly";  
  11. public const String strConst = "Const Changed";  
  12. public static readonly String strStaticReadonly = "StaticReadonly Changed";  
  13. }  

from:http://blog.csdn.net/high_mount/article/details/6665573

分享到:
评论

相关推荐

    c#.net中const和readonly的区别

    C# 中的 const 和 readonly 关键字都可以用来定义常量,但它们之间存在一些重要的区别。这些区别主要体现在声明方式、初始化时机、存储位置、可修改性、类型限制以及在系统开发中的使用策略上。 首先,const 关键字...

    C#编程中 readonly与const的区别

    在C#编程语言中,`readonly`和`const`这两个关键字都用于定义只读字段,但它们之间存在一些重要的区别。理解这些区别有助于更好地设计和实现软件系统,尤其是在需要创建不可变数据或常量时。 #### 二、`const`...

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

    在C#编程语言中,`const` 和 `readonly` 关键字都用于声明常量,但它们之间存在一些显著的区别。常量是不可更改的值,一旦被赋值后就不能再次修改。 首先,`const` 关键字用于声明编译时常量。这意味着,任何用 `...

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

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

    浅谈c#中const与readonly区别

    在C#编程语言中,`const`和`readonly`都是用来定义不可变的变量,但它们之间存在着重要的差异。理解这些差异有助于编写更加高效和安全的代码。 首先,`const`关键字用于声明编译时常量。这意味着,一旦声明了一个`...

    C#中 const 和 readonly 的不同

    在C#编程语言中,`const`和`readonly`关键字都是用来定义不可变的值,但它们之间存在着一些显著的区别。下面将详细解释这两个关键字的特性和用途。 首先,`const`关键字用于声明一个常量,它是一个在编译时就确定其...

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

    在C#编程语言中,了解并正确使用`const`、`static`和`readonly`关键字是至关重要的。这些关键字修饰的变量在程序的不同阶段被初始化,并具有不同的作用域和使用方式。下面将详细阐述这三个关键字的区别。 首先,`...

    浅谈Java中的final关键字与C#中的const, readonly关键字

    本文将深入探讨Java中的`final`关键字以及C#中的`const`和`readonly`关键字,了解它们如何分别实现编译时常量和运行时不可变性。 ### Java中的`final`关键字 #### 1. 编译器常量 在Java中,`final`关键字可以用来...

    C#中const用法详解

    然而,需要注意的是,`const`关键字与`readonly`关键字之间存在关键区别。`const`字段只能在声明时初始化,而`readonly`字段可以在声明或构造函数中初始化。这意味着`readonly`字段的值可以在运行时根据需要有所不同...

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

    前者用“const”来定义,后者用“readonly”来定义。 对于静态常量(Compile-time constant),它的书写方式如下: public const int MAX_VALUE = 10; 为什么称它为静态常量呢,因为如上声明可以按照如下理解(注意...

    Java和C#的比较

    C#使用static关键字来定义静态构造函数,而Java使用static关键字来定义静态变量和方法。 Main函数 Java中的main函数必须是public static void main(String[] args)的样子,否则虚拟机拒绝运行。C#中,Main函数可以...

    c#编程的50个技巧

    在 C# 中,有两种类型的常量:readonly 和 const。readonly 变量可以在运行时被初始化,而 const 变量必须在编译时被初始化。在大多数情况下,优先使用 readonly 变量。 3. 优先使用 as 操作符 在 C# 中,有两种...

    C#与java的区别

    2. **常量**:C#使用`const`声明常量,与Java的`static final`类似。此外,C#还有`readonly`关键词,用于声明编译时无法确定值的常量。 3. **公用类的入口点**:C#的主程序入口点是`Main`方法,与Java的`main`相似...

    C#基础概念二十五问

    这里我们探讨两个基础概念:静态成员与非静态成员,以及const和static readonly的区别。 1. 静态成员与非静态成员的区别: 静态成员(包括静态变量、静态方法等)是属于类的,而不是类的实例。这意味着无论创建...

    java与C#的区别 (2).pdf

    7. 常量声明:C#使用const和readonly,Java用static final。 8. switch语句:C#的switch可以处理字符,甚至字符串,Java仅限于整数。 9. 移位操作符:C#缺少无符号右移>>>。 10. goto语句:C#支持goto,但使用谨慎,...

    C#设置窗体最前端显示

    在C#中,我们可以使用System.Windows.Forms命名空间下的Form类来创建和管理窗体。 要使窗体始终显示在其他窗口的最前端,可以使用Form类的BringToFront方法。这个方法会将当前窗体移动到Z轴的最前面,使其成为活动...

    最新C#/.Net/数据库笔试资料大整理

    另一方面,`const`和`static readonly`都是用来声明不可变的值,但它们的初始化时机和使用方式有所不同。`const`关键字声明的常量是在编译时就确定其值的,这些值会被直接插入到使用常量的代码中。一旦定义,`const`...

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

    变量等基础语法(必看篇)C#把整个文件内容读入字符串变量的方法C#中static静态变量的用法实例C#不同类型的成员变量(字段)的默认值介绍C#类中属性与成员变量的使用小结C#中属性和成员变量的区别说明在c#中把字符串转

Global site tag (gtag.js) - Google Analytics