readonly与const

http://www.cnblogs.com/Kenny-Jiang上看到他关于readonly与const的区别的讲解,而且看到后边的回复也有一些讲解..
 受益良多.在此把众位的观点摘录如下:

 一、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可以是任何类型
posted @ 2008-05-27 09:17  mcjeremy  阅读(496)  评论(0编辑  收藏  举报
------------------------------------ 心静似高山流水不动,心清若巫峰雾气不沾 ------------------------------------