关于构造函数及参数执行顺序说明(c#)

Posted junmail

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于构造函数及参数执行顺序说明(c#)相关的知识,希望对你有一定的参考价值。

以前自己对这方面的内容一直比较模糊,只是知道一个大概的顺序,具体确切的执行顺序不能确定,于是抽空做了一个详细的测试,对其进行一番研究.
具体的程序代码比较简单,如下所示.
三个类分开来写的,一个父类,一个子类,一个测试类:

父类:

using System;

namespace TestInherit
{
 public class Father
 {
  public int father_a=111;
  public int father_aa=1111;
  public readonly int father_c=7777;
  public static int father_e=222;
  public static int father_ee;
  static Father()
  {
   father_e=5555;
   father_ee=3333;
  }

  public Father()
  {
   father_ee=4444;
  }
  public Father(int a)
  {
   father_a=a;
  }    
 }
}

 子类:

using System;

namespace TestInherit
{
 public class Son:Father
 {  
  public int son_int=9999;
  public static int son_b=111;
  public static int son_c;
  public Son()
  {
   son_c=222;   
  }
  static Son()
  {
   son_c=333;
  }
  public Son(int a)
  {
   son_int=a;
  }
 }
}

 测试类:

using System;

namespace TestInherit
{
 class Class1
 {
  [STAThread]
  static void Main(string[] args)
  {
    Son son1=new Son ();
  }
 }
}

然后一路F11,进行跟踪,可以得到完整的执行顺序如下所示:
1.子类静态变量;
2.子类静态构造函数;
3.子类非静态变量;
4.父类静态变量;
5.父类静态构造函数;
6.父类非静态变量;
7.父类无参构造函数;
8.子类无参构造函数;

如果Main()方法中改为Son son1=new Son (111),顺序为;
1.子类静态变量;
2.子类静态构造函数;
3.子类非静态变量;
4.父类静态变量;
5.父类静态构造函数;
6.父类非静态变量;
7.父类无参构造函数;
8.子类有参构造函数;


如果子类的有参构造函数改为:
 public Son(int a):base(a)
 {
  son_int=a;
 }
则顺序又有所改变:

1.子类静态变量;
2.子类静态构造函数;
3.子类非静态变量;
4.父类静态变量;
5.父类静态构造函数;
6.父类非静态变量;
7.父类有参构造函数;
8.子类有参构造函数;

以上测试改为父类声明,子类实现,结果也是一样,即mian()方法中改为Father son1=new Son ();

最后作一个总结:
1.一般原理是被依赖的先构造,依赖于人的后构造,c#中是同层依赖(成员变量,其他的类变量等)优先于跨层依赖(父子关系)构造(注意java中正好相反);(子类的变量是不是可以理解为同层的依赖呢??)
2.静态构造函数,静态参数都是优先于非静态构造函数,非静态参数构造或初始化;

以上是关于关于构造函数及参数执行顺序说明(c#)的主要内容,如果未能解决你的问题,请参考以下文章

C#的构造函数在基类和父类中执行顺序

关于继承中静态代码块,构造代码块,构造函数执行顺序

Java静态代码块代码块及构造函数执行顺序

java 关于Java中静态代码块以及构造函数的执行先后顺序

关于子类对象的构造函数和父类构造函数的执行顺序

静态代码块构造代码块构造函数以及Java类初始化顺序