引用类型的实例构造函数不能被继承(不过,可以通过 base 关键字调用父类的构造函数),它负责初始化类型的实例字段。
对于静态字段,由静态构造函数负责。当然,也可以在实例构造函数中为静态成员赋值,但是,当之后更改这个值,再创建一个新的实例时,你会发现值又被实例构造函数改回去了。
所以,通常在静态构造函数中为静态成员赋值 (因为它只会执行一次)。
如果类型没有定义任何构造函数,C# 会生成一个无参实例构造函数(.ctor),它遍历类 型中所有的成员,并将它们设置为默认值。
可以声明多个不同的构造函数。可以利用 this 关键字来调用其他构造函数。例如:
public class AClass
{
    public int i;
    public static int j;
    static AClass()
    {
        j = 2;
        Console.WriteLine("静态构造函数");
    }
    public AClass() : this(5)
    {
        Console.WriteLine("实例构造函数");
    }
    public AClass(int i)
    {
        this.i = i;
        Console.WriteLine("有参数的实例构造函数");
    }
}
在这个例子中,我们使用下面的代码新建实例:
static void Main(string[] args)
{
    var a = new AClass();
    Console.WriteLine(a.i);
    var b = new AClass(10);
    Console.WriteLine(b.i);
    Console.ReadKey();
}
根据规则,创建 a 时,调用无参的构造函数。但无参的构造函数调用了有参的构造函数,所以,先执行有参的构造函数,将 i 设置为 5,再执行无参的构造函数。
创建 b 则只调用有参的构造函数。最后的输出结果如下图所示。