类型初始化

       最近两天在看《.Net本质论》其中提到了一类型初始化中比较关键的两个方法:类型初始化器(cctor)和构造函数(ctor)。构造函数不用多说,上学时就知道,但是类型初始化器我是刚刚知道,它是一个无返回值、无参数、静态的函数,在类型首次被加载时调用,接下来来看个例子:

class Class1

    {

        private static int i;

 

        /// <summary>

        /// cctor

        /// </summary>

        static Class1()

        {

            i = 1;

            Console.WriteLine(i);

        }

 

        /// <summary>

        /// ctor

        /// </summary>

        public Class1()

        {

            i = 2;

            Console.WriteLine(i);

        }

}

       再用ClientApp调用做一个实验:

class Program

    {

        static void Main(string[] args)

        {

            Class1 a = new Class1();

            Class1 b = new Class1();

            Console.Read();

        }

}

结果是:

1

2

2

       由此可见只有在类型首次被加载时才执行类型初入化器,再来看看元数据。原来

在看类型的元数据时并没有太注意:



       在我们编写类型时,即使不写cctor,系统也会给我们默认一个。

 

       对于上面的程序还有另一种写法:

class Class1

    {

        private static int i = 1;

 

        /// <summary>

        /// cctor

        /// </summary>

        static Class1()

        {

            //i = 1;

            Console.WriteLine(i);

        }

 

        /// <summary>

        /// ctor

        /// </summary>

        public Class1()

        {

            i = 2;

            Console.WriteLine(i);

        }

}

i这个成员变量在声明时初始化,但是结果是一样的,这说明了,在类型第一次被加载时首先执行的时这些静态成员变量的附值,然后时类型初始化器中的内容,在被实例化时才调用构造函数。

posted @ 2007-02-26 11:01  KiddLee  Views(777)  Comments(3Edit  收藏  举报