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

C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景。
工作原理
readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量。
const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值。
下面声明两个常量:

public static readonly int A = 2; //A为运行时常量
public const int B = 3; //B为编译时常量
下面的表达式:

int C = A + B;
经过编译后与下面的形式等价:

int C = A + 3;
可以看到,其中的const常量B被替换成字面量3,而readonly常量A则保持引用方式。
声明及初始化
readonly常量只能声明为类字段,支持实例类型或静态类型,可以在声明的同时初始化或者在构造函数中进行初始化,初始化完成后便无法更改。
const常量除了可以声明为类字段之外,还可以声明为方法中的局部常量,默认为静态类型(无需用static修饰,否则将导致编译错误),但必须在声明的同时完成初始化。

数据类型支持
由于const常量在编译时将被替换为字面量,使得其取值类型受到了一定限制。const常量只能被赋予数字(整数、浮点数)、字符串以及枚举类型。下面的代码无法通过编译:

public const DateTime D = DateTime.MinValue;
改成readonly就可以正常编译:

public readonly DateTime D = DateTime.MinValue;
可维护性
readonly以引用方式进行工作,某个常量更新后,所有引用该常量的地方均能得到更新后的值。
const的情况要稍稍复杂些,特别是跨程序集调用:

public class Class1
{
public static readonly int A = 2; //A为运行时常量
public const int B = 3; //B为编译时常量
}

public class Class2
{
public static int C = Class1.A + Class1.B; //变量C的值为A、B之和
}

Console.WriteLine(Class2.C); //输出"5"
假设Class1与Class2位于两个不同的程序集,现在更改Class1中的常量值:

public class Class1
{
public static readonly int A = 4; //A为运行时常量
public const int B = 5; //B为编译时常量
}
编译Class1并部署(注意:这时并没有重新编译Class2),再次查看变量C的值:

Console.WriteLine(Class2.C); //输出"7"
结果可能有点出乎意料,让我们来仔细观察变量C的赋值表达式:

public static int C = Class1.A + Class1.B;
编译后与下面的形式等价:

public static int C = Class1.A + 3;
因此不管常量B的值如何变,对最终结果都不会产生影响。虽说重新编译Class2即可解决这个问题,但至少让我们看到了const可能带来的维护问题。

性能比较
const直接以字面量形式参与运算,性能要略高于readonly,但对于一般应用而言,这种性能上的差别可以说是微乎其微。

适用场景
在下面两种情况下:
a.取值永久不变(比如圆周率、一天包含的小时数、地球的半径等)
b.对程序性能要求非常苛刻
可以使用const常量,除此之外的其他情况都应该优先采用readonly常量。

时间: 2024-09-29 01:33:28

C#中的static、readonly与const的比较的相关文章

c++中,static,和const,以及引用类型的作用

这是现阶段我自己总结的,希望各位补充一下: 先说static: 它表示静态 所以1.隐藏,全局变量或者全局函数加上static则其他文件无法访问,只在当前文件生效 2.保持变量的内容持久,由于static变量存储在全局区一经初始化则知道程序结束菜户被释放 3.默认初始化变量的值为0 4.在定义的时候将成员变量或者成员函数加上static,则变为属于类的成员,所有对象共享 const 关键词的作用 1.修饰变量    const int a=10,a是常量,在声明的时候初始化一次,以后不能在赋值

【转】const和static readonly

我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等.在多数情况下可以混用.二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值.而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值.明白了这个本质区别,我们就不难看出下面的语句中static readonly和const能否互换了: 1. static readonly MyClass myins = new M

[转]C# const和static readonly区别

我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等.在多数情况下可以混用.二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值.而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值.明白了这个本质区别,我们就不难看出下面的语句中static readonly和const能否互换了: 1. static readonly MyClass myins = new M

(C#) What is the difference between "const" and "static readonly" ?

const int a must be initialized initialization must be at compile time readonly int a can use default value, without initializing initialization can be at run time 二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值.而static readonly是在运行时计算出其值的,所以还可以通过静态构造

【Unity|C#】基础篇(6)——const、readonly、static readonly

[学习资料] <C#图解教程>(第6章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu.com/s/1mhOmBG0 [内容] const readonly static readonly 三者比较 [笔记] const 编译时常量 类的常量 只能在声明时赋值 readonly 运行时常量 对象的常量 可以在 声明时 赋值(与常量一样),或 构造函数中 赋值 static readonly 运行时

[C#]readonly vs const

C#中的readonly和const两个关键字都可以用来定义系统变量,那两者之间有什么区别呢? 1. const变量赋值后,就不可以对其进行修改.且在定义时就需要给它赋值,使用const修饰的变量是static的.可以使用YourClass.ConstantName的方式进行访问: 2. readonly变量可以在定义时赋值,也可以在构造方法中赋值或者修改定义时赋给的初始值: 另外还有一个细微的差别.看下面的场景,我在AssemblyA中定义了一个类如下: public class Readon

浅谈C#中const、static readonly区别

const 编译时常量 static readonly 运行时常量 直接上代码 1.新建一个类库BLL->添加类Teacher 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace BLL 8 { 9 public class Teacher 10 { 11 public

C#中的readonly与const

比较C#中的readonly与const C#中有两种常量类型,分别为readonly(运行时常量)[read-run]与const(编译时常量)[const-compile],本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理     readonly为运行时常量,程序运行时进行赋值,赋值完成后便无法更改,因此也有人称其为只读变量.    const为编译时常量,程序编译时将对常量值进行解析,并将所有常量引用替换为相应值.    下面声明两个常量:  public stati

C#中的readonly跟const用法小结

总结一下常量和只读字段的区别: 由来: 笔者也是在看欧立奇版的<.Net 程序员面试宝典>的时候,才发现自己长久以来竟然在弄不清出两者的情况下,混用了这么长的时间.的确,const与readonly 很像,都是将变量声明为只读,且在变量初始化后就不可改写.那么,const与readonly 这两个修饰符到底区别在什么地方呢?其实,这个牵扯出C#语言中两种不同的常量类型:静态常量(compile-time constants)和动态常量(runtime constants).这两者具有不同的特性