引用类型的实例构造函数不能被继承(不过,可以通过 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 则只调用有参的构造函数。最后的输出结果如下图所示。