浅谈对象的初始化顺序

当构造一个c#对象时,理解对象的字段和构造函数的顺序是非常重要的:
  1. Derived static fields//派生类静态字段
  2. Derived static constructor//派生来静态构造函数
  3. Derived instance fields//派生类实例字段
  4. Base static fields//基类静态字段
  5. Base static constructor//基类静态构造函数
  6. Base instance fields//基类实例字段
  7. Base instance constructor//基类实例构造函数
  8. Derived instance constructor//派生类实例构造函数
下面是简单的代码:
 1 using  System;
 2
 3 namespace  ObjectInit
 4 {
 5    class Program
 6    {
 7        static void Main( string[] args )
 8        {
 9            Derived d = new Derived();
10            Console.ReadLine();
11        }

12    }

13    class Base
14    {
15        public Base()
16        {
17            Console.WriteLine( "Base.Instance.Constructor" );
18            this.m_Field3 = new Tracker( "Base.Instance.Field3″ );
19            this.Virtual();
20        }

21        static Base()
22        {
23            Console.WriteLine( "Base.Static.Constructor" );
24        }

25        private Tracker m_Field1 = new Tracker( "Base.Instance.Field1″ );
26        private Tracker m_Field2 = new Tracker( "Base.Instance.Field2″ );
27        private Tracker m_Field3;
28        static private Tracker s_Field1 = new Tracker( "Base.Static.Field1″ );
29        static private Tracker s_Field2 = new Tracker( "Base.Static.Field2″ );
30        virtual public void Virtual()
31        {
32            Console.WriteLine( "Base.Instance.Virtual" );
33        }

34    }

35    class Derived : Base
36    {
37        public Derived()
38        {
39            Console.WriteLine( "Derived.Instance.Constructor" );
40            this.m_Field3 = new Tracker( "Derived.Instance.Field3″ );
41        }

42        static Derived()
43        {
44            Console.WriteLine( "Derived.Static.Constructor" );
45        }

46        private Tracker m_Field1 = new Tracker( "Derived.Instance.Field1″ );
47        private Tracker m_Field2 = new Tracker( "Derived.Instance.Field2″ );
48        private Tracker m_Field3;
49        static private Tracker s_Field1 = new Tracker( "Derived.Static.Field1″ );
50        static private Tracker s_Field2 = new Tracker( "Derived.Static.Field2″ );
51        override public void Virtual()
52        {
53            Console.WriteLine( "Derived.Instance.Virtual" );
54        }

55    }

56    class Tracker
57    {
58        public Tracker( string text )
59        {
60            Console.WriteLine( text );
61        }

62    }

63}

64
65 下面是程序执行结果:
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
Derived.Instance.Virtual
Derived.Instance.Constructor
Derived.Instance.Field3

C#对象初始化的原则 :


  • Fields then Constructor.  //先初始化字段,后执行构造函数.
  • Static then Instance. //在第一次访问类时,先初始化静态字段和构造函数,后初始化对象的实例字段和构造函数.
  • Derived then Base. // 不论字段还是静态构造函数,派生类对象总是先于基类对象初始化.
  • Except Instance Constructors.  //对于实例构造函数,基类构造函数总是先于派生类的实例构造函数初始化.
  • Don't Assume Field Order.  //字段的初始化顺序总是按照他们在源文件的定义顺序执行的.
  • Two-Phase for Virtual. //避免从构造函数中调用虚拟方法.

转载于:https://www.cnblogs.com/yangjie5188/archive/2008/02/22/1077531.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值