c#中构造函数,以及变量的执行顺序说明
以前自己对这方面的内容一直比较模糊,只是知道一个大概的顺序,具体确切的执行顺序不能确定,于是抽空做了一个详细的测试,对其进行一番研究.
具体的程序代码比较简单,如下所示.
三个类分开来写的,一个父类,一个子类,一个测试类:
父类:
using System;
namespace TestInherit
{
/// <summary>
/// Father 的摘要说明。
/// </summary>
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
{
/// <summary>
/// Sun 的摘要说明。
/// </summary>
public class Sun:Father
{
public int sun_int=9999;
public static int sun_b=111;
public static int sun_c;
public Sun()
{
sun_c=222;
}
static Sun()
{
sun_c=333;
}
public Sun(int a)
{
sun_int=a;
}
}
}
测试Class1类
using System;
namespace TestInherit
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
Sun sun1=new Sun ();
}
}
}
然后一路F11,进行跟踪,可以得到完整的执行顺序如下所示:
1.子类静态变量;
2.子类静态构造函数;
3.子类非静态变量;
4.父类静态变量;
5.父类静态构造函数;
6.父类非静态变量;
7.父类无参构造函数;
8.子类无参构造函数;
如果Main()方法中改为Sun sun1=new Sun (111),顺序为;
1.子类静态变量;
2.子类静态构造函数;
3.子类非静态变量;
4.父类静态变量;
5.父类静态构造函数;
6.父类非静态变量;
7.父类无参构造函数;
8.子类有参构造函数;
如果子类的有参构造函数改为:
public Sun(int a):base(a)
{
sun_int=a;
}
则顺序又有所改变:
1.子类静态变量;
2.子类静态构造函数;
3.子类非静态变量;
4.父类静态变量;
5.父类静态构造函数;
6.父类非静态变量;
7.父类有参构造函数;
8.子类有参构造函数;
以上测试改为父类声明,子类实现,结果也是一样,即mian()方法中改为Father sun1=new Sun ();.
最后作一个总结:
1.一般原理是被依赖的先构造,依赖于人的后构造,c#中是同层依赖(成员变量,其他的类变量等)优先于跨层依赖(父子关系)构造(注意java中正好相反);(子类的变量是不是可以理解为同层的依赖呢??)
2.静态构造函数,静态参数都是优先于非静态构造函数,非静态参数构造或初始化;
有误之处,欢迎大家指正!!