c# 构造函数执行顺序

转载自 http://blog.csdn.net/gshgsh1228/article/details/50867274

所有的类都至少包含一个构造函数。这些构造函数中可能有一个默认的构造函数,默认的构造函数没有参数,与类同名。其它带参数的构造函数称为非默认的构造函数。

在类的外部不能用私有的构造函数实例化对象,通过把默认的构造函数设置为私有,就可以强制类的用户使用非默认的构造函数。

一些类没有公共的构造函数,外部代码就不能实例化它。

静态成员,也称为共享成员,可以在类的实例之间共享。静态成员通过类直接引用。

一个类只能有一个静态的构造函数,该构造函数不能有访问修饰符,也不能带任何参数。静态构造函数不能直接调用,只能在下述情况下执行:

(1)创建包含静态构造函数的类的实例时

(2)访问包含静态构造函数的类的静态成员时

非静态构造函数也称实例构造函数。

静态类只包含静态成员,且不能用于实例化对象(如Console)。

任何构造函数都可以配置为在执行自己的代码前调用其他构造函数。

创建类的实例时,会调用类的构造函数,为了实例化派生的类,必须实例化它的基类;要实例化这个基类,有必须实例化这个基类的基类,这样一直实例化System.Object(所有类的根),因此无论使用什么构造函数实例化一个类,总是首先调用System.Object.Object().

下面用例子说明构造函数的执行顺序:

publicclass MyBaseClass

{

  Public MyBaseClass()

{

}

  Public MyBaseClass(int i)

  {

  }

}

publicclass MyDerivedClass:MyBaseClass

{

  public MyDerivedClass()

  {

  }

  public MyDerivedClass(int i)

  {

  }

  public MyDerivedClass(int i,int j)

  {

  }

}

 

使用下面语句实例化MyDerivedClass

MyDerivedClass myObj=new MyDerivedClass();

构造函数执行顺序如下:

(1)执行System.Object.Object()

(2)执行MyBaseClass.MyBaseClass()

(3)执行MyDerivedClass.MyDerivedClass()

另外,使用下面语句实例化MyDerivedClass

MyDerivedClass myObj=newMyDerivedClass(4,8);

构造函数执行顺序如下:

(1)执行System.Object.Object()

(2)执行MyBaseClass.MyBaseClass()

(3)执行MyDerivedClass.MyDerivedClass(int i,int j)

如果我们想要得到下面的执行顺序:

(1)执行System.Object.Object()

(2)执行MyBaseClass.MyBaseClass(inti)

(3)执行MyDerivedClass.MyDerivedClass(int i,int j)

可以使用base关键字指定.NET实例化过程中使用基类中具有指定参数的构造函数,即:

publicclass MyDerivedClass:MyBaseClass

{

  public MyDerivedClass()

  {

  }

  public MyDerivedClass(int i)

  {

  }

  public MyDerivedClass(int i,int j):base(i)

  {

  }

}

这样将不会调用MyBaseClass.MyBaseClass()

除base关键字外,关键字this也可指定构造函数初始化器。这个关键字指定在调用指定的构造函数前,.NET实例化过程对当前类使用非默认的构造函数。

例如:

publicclass MyDerivedClass:MyBaseClass

{

  publicMyDerivedClass():this(5,6)

  {

  }

  public MyDerivedClass(int i)

  {

  }

  publicMyDerivedClass(int i,int j):base(i)

  {

  }

}

使用MyDerivedClass. MyDerivedClass()构造类,将执行下列序列:

(1)执行System.Object.Object()

(2)执行MyBaseClass.MyBaseClass(inti)

(3)执行MyDerivedClass.MyDerivedClass(int i,int j)

(4)执行MyDerivedClass.MyDerivedClass()

原文地址:https://www.cnblogs.com/TJessica/p/6366066.html