当构造一个c#对象时,理解对象的字段和构造函数的顺序是非常重要的:
- Derived static fields//派生类静态字段
- Derived static constructor//派生来静态构造函数
- Derived instance fields//派生类实例字段
- Base static fields//基类静态字段
- Base static constructor//基类静态构造函数
- Base instance fields//基类实例字段
- Base instance constructor//基类实例构造函数
- Derived instance constructor//派生类实例构造函数
下面是简单的代码:
using System;
namespace ObjectInit
{
class Program
{
static void Main( string[] args )
{
Derived d = new Derived();
Console.ReadLine();
}
}
class Base
{
public Base()
{
Console.WriteLine( "Base.Instance.Constructor" );
this.m_Field3 = new Tracker( "Base.Instance.Field3″ );
this.Virtual();
}
static Base()
{
Console.WriteLine( "Base.Static.Constructor" );
}
private Tracker m_Field1 = new Tracker( "Base.Instance.Field1″ );
private Tracker m_Field2 = new Tracker( "Base.Instance.Field2″ );
private Tracker m_Field3;
static private Tracker s_Field1 = new Tracker( "Base.Static.Field1″ );
static private Tracker s_Field2 = new Tracker( "Base.Static.Field2″ );
virtual public void Virtual()
{
Console.WriteLine( "Base.Instance.Virtual" );
}
}
class Derived : Base
{
public Derived()
{
Console.WriteLine( "Derived.Instance.Constructor" );
this.m_Field3 = new Tracker( "Derived.Instance.Field3″ );
}
static Derived()
{
Console.WriteLine( "Derived.Static.Constructor" );
}
private Tracker m_Field1 = new Tracker( "Derived.Instance.Field1″ );
private Tracker m_Field2 = new Tracker( "Derived.Instance.Field2″ );
private Tracker m_Field3;
static private Tracker s_Field1 = new Tracker( "Derived.Static.Field1″ );
static private Tracker s_Field2 = new Tracker( "Derived.Static.Field2″ );
override public void Virtual()
{
Console.WriteLine( "Derived.Instance.Virtual" );
}
}
class Tracker
{
public Tracker( string text )
{
Console.WriteLine( text );
}
}
}
下面是程序执行结果:
Derived.Static.Field1
Derived.Static.Field2
Derived.Static.Constructor
Derived.Instance.Field1
Derived.Instance.Field2
Base.Static.Field1
Base.Static.Field2
Base.Static.Constructor
Base.Instance.Field1
Base.Instance.Field2
Base.Instance.Constructor
Base.Instance.Field3