类型初始化
最近两天在看《.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
{
Class
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这个成员变量在声明时初始化,但是结果是一样的,这说明了,在类型第一次被加载时首先执行的时这些静态成员变量的附值,然后时类型初始化器中的内容,在被实例化时才调用构造函数。