class Class1
{
public static readonly int max;
static Class1()
{
max = 1;
Console.WriteLine(max);
}
}
/*这是一个类的静态构造函数
Class1 c1 = new Class1();之后这个构造函数就会执行一次*/
struct jiegou
{
public static int a = 1;
public static int b = 2;
static jiegou()
{
//a = c;
//b = d;
Console.WriteLine(a);
Console.WriteLine(b);
}
}
//这是一个结构的静态构造函数
jiegou jg = new jiegou();之后为什么没有输出a和b??
让我们先来看看class和struct在调用构造函数时的区别。class使用newobj指令而struct使用initobj指令来构造对象。newobj在堆上申请一块内存并调用相应的构造函数进行初始化,然后将对象地址返回给计算栈。initobj则是从本地变量表中载入已经分配出来的struct实例然后初始化struct的各字段。这个初始化过程是CLR内部执行的,而不像class编译器会给class添加一个默认构造函数(这就是为什么struct不能给字段添加默认值的原因。但在类中如果给字段添加了默认值编译器就会自动在构造函数中添加字段赋值操作)。如果给struct中定义了一个有参数的构造函数,那么系统就不会使用initobj指令,而是直接用call指令调用带参数的构造函数。