.NET类的成员变量初始化与构造函数执行的顺序
.NET类的成员变量初始化与构造函数执行的顺序是怎样的呢?可以通过下面的测试得出。
namespace MSIL.Tests { public class BaseType { string field = Helper.WriteLine("base type instance field"); static string staticField = Helper.WriteLine("base type static field"); static BaseType() { Console.WriteLine("base type cctor"); } public BaseType() { Console.WriteLine("base type ctor"); } } public class DerivedType : BaseType { string field = Helper.WriteLine("derived type instance field"); static string staticField = Helper.WriteLine("derived type static field"); static DerivedType() { Console.WriteLine("derived type cctor"); } public DerivedType() { Console.WriteLine("derived type ctor"); } } public class Helper { public static string WriteLine(string info) { Console.WriteLine(info); return info; } } [TestFixture] public class BaseTypeTestFixture { [Test] public void TestNewDerivedType() { var obj = new DerivedType(); } } }
在执行了TestNewDerivedType这个用例后会在输出中显示如下结果:
derived type static field derived type cctor derived type instance field base type static field base type cctor base type instance field base type ctor derived type ctor可以得出其顺序是:
- 派生类静态成员变量
- 派生类静态构造函数
- 派生类实例成员变量
- 基类静态成员变量
- 基类静态构造函数
- 基类实例成员变量
- 基类实例构造函数
- 派生类实例构造函数
另见
Essential .NET Volume 1: The Common Language Runtime Page 60 Types and Initialization