static、readonly、const的比较

一、const与readonly的区别

  const的值是在编译是确定的,它的值是保存在程序集的元数据,所以不分配内存.

这句话的意思大家可以自己Debug一下,无论是全局Const变量还是局部Const变量,单步调试时根本不会执行定义常量const string constMember = "const"这一行。

  readonly是在运行时分配内存空间,至于如果分配内存,后面会开个单章专门讲变量的内存分配,这里不再多说.readonly变量可以有两个地方赋值,一个是在定义的时候去赋值,再就是在构造函数里面去赋值.

另外一点非常重要,比如有一个类库CSharpConstLib,里面包含了类SomeType

  public class SomeType
  {

     public const int ConstField = 50;

     public static readonly int ReadonlyField = 50;

  }

另外一个控制台程序引用CSharpConstLib.dll

   Console.WriteLine("Const field is {0}.", SomeType.ConstField);
   Console.WriteLine("Readonly field is {0}.", SomeType.ReadonlyField);

这个时候运行exe文件输出50,50.

如果我们更改SomeType

     public const int ConstField = 500;

     public static readonly int ReadonlyField = 500;

然后编译CSharpConstLib,再将控制台程序老的CSharpConstLib.dll替换掉,运行exe,输出是50,500.所以一定要编译.

 

二、static成员和非static成员

  在一个类中定义全局的static成员和非static静态成员以及static构造函数和非static构造函数,执行顺序是static成员-->static构造函数-->非static静态成员-->非static构造函数.

  无论对一个类创建多少个实例,它的静态成员都只有一个副本,意思是重新创建类实例的时候,非static成员会也会重新创建,而是static成员不会,并且static构造函数只会执行一次。

   静态方法和属性不能访问其包含类型中的非静态字段和事件,另外不支持静态局部变量. 静态成员不能标记为 override、virtual 或 abstract,也就是不能重写,但能重载.

 

 static、readonly、const的比较     

 

static、readonly、const的比较

 

static、readonly、const的比较

 

static、readonly、const的比较

 

static、readonly、const的比较

 

static、readonly、const的比较