受益良多.在此把众位的观点摘录如下:
一、readonly和const是两种不同的常量,其中readonly是运行时常量,而const是编译时常量。
举例:
public static readonly int A = 2; //A为运行时常量
public const int B = 3; //B为编译时常量
注意,const默认为static类型,所以无需用static修饰,如果强制用static进行声明将导致编译错误。
下面的表达式:
int C = A + B;
经过编译后与下面的形式等价:
int C = A + 3;
可以看到,其中的const常量B被替换成字面量3,而readonly常量A则保持引用方式。
const常量只能被赋予数字(整数、浮点数)、字符串以及枚举类型。下面的代码无法通过编译:
public const DateTime D = DateTime.MinValue;
改成readonly就可以正常编译:
public readonly DateTime D = DateTime.MinValue;
二、const常数表达式在编译时是完全可以计算的,因此不能通过一个变量的值来进行初始化,比如:
public const int A=b+1;
此时的b是一个变量 ,显然,在编译时是不可以计算的。因此,const常数表达式(变量)不可以用变量来初始化。
而 readonly可以把设定一个字段为常量,但由于它是运行时计算的,因此可以通过变量进行初始化。
三:两者的区别之处:
1. const 字段只能在该字段的声明中初始化。
对于某个类来说:readonly常量是其实例成员。因此readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly字段可能具有不同的值。
2. const 字段是编译时常数,而 readonly 字段可用于运行时常数。
3. const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。
4. const 对于引用类型的常数,可能的值只能是 string 和 null。对于值类型的常数可以是数字(整数、浮点数)以及枚举类型
readonly可以是任何类型