容易被忽视,错用的构造函数 .cctor-- 静态构造函数
本帖最后由 amandag 于 2010-03-12 08:21:11 编辑
            .ctor 是大家都知道的
.cctor 却不被人所熟习,也很容易被误用
所谓的的 .cctor 放在C#的语法中,就是静态的构造函数
形如
class  A
{
   static A() // 这就是一个.cctor构造函数
}
.cctor  与 .ctor之间的异同
   1,不能有访问权限标识符 public,private,等等,都不能使用,这与.ctor不同
   2,不能有返回值,这与.ctor相同
   3,不能有参数,.ctor可以拥有多个参数
   4,最多只能有一个,.ctor至少要有一个
   5,程序员不能控制调用.cctor的时机,.ctor 从某种意义上说,程序员可以控制它调用的时机
   6,程序员无法直接调用.cctor , .ctor 当程序员使用new操作符时,.ctor是一定会被调用的
.cctor 的调用时机 :
    在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。(这是MSDN上的原话)
    很明显,同一个程序域中.cctor 只会调用一次,而不是像.ctor每次实例化对象都会被调用
.cctor用处
    静态构造函数用于初始化任何静态 数据,或用于执行仅需执行一次的特定操作。
举例说明:
以下所有代码 在 windows 7, vs 2005 Release 模式下编译确认,若结果不同,请考虑换成release模式重试
using System;
namespace only_lonely
{
    class A
    {
        static void Main(String[] args)
        {
        }
    }
}
 将此段代码编译,然后使用ILDASM查看,方法表如下
 .ctor() : void //这是由编译器自动提供的类的实例构造函数
 Main():void(string[]) //程序入口点
很显然,程序集中并没有.cctor 的身影,在类没有静态的字段需要初始化时,编译器是不会自动提供.cctor函数的,这又与.ctor不同,无论怎样,.ctor一直存在
修改代码
using System;
namespace only_lonely
{
    class A
    {
   
        static void Main(String[] args)
        {
        }
        static Int32 i = 0;
    }
}
编译此段代码,会有一个警告,但那并不重要的,重要的是用ILDASM查看程序集时,预料中的.cctor,静态构造函数并没有出现!
what happened?
难道推论错误了吗?.cctor并不是用来初始化类的静态字段?
take it easy ,请看一下段代码
using System;
namespace only_lonely
{
    class A
    {
   
        static void Main(String[] args)
        {
        }
       static Int32 i = 1;
    }
}
此段代码与上一段代码的唯一不同就是变更了静态字段i的初始值,接下来,就是见证神奇的时刻
让我们DASM 它,令人吃惊的是,千呼万唤的.cctor终于出现了!
查看.cctor的实现代码,会看到
.method private hidebysig specialname rtspecialname static
        void  .cctor() cil managed
{
  // Code size       7 (0x7)
  .maxstack  8
  IL_0000:  ldc.i4.1  //实例化静态的字段 :-)
  IL_0001:  stsfld     int32 only_lonely.A::i