惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
腾讯CDC
G
Google Developers Blog
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
aimingoo的专栏
aimingoo的专栏
有赞技术团队
有赞技术团队
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
罗磊的独立博客
博客园 - 三生石上(FineUI控件)
美团技术团队
WordPress大学
WordPress大学
阮一峰的网络日志
阮一峰的网络日志

博客园 - Lucky Jack

在C#中展示嵌入的RTF文件 SQL进行排序、分组、统计的10个新技巧 select into 和 insert into select的区别 Convert的妙用 DataGridView中回车键的妙用 如何去除C#Strings中的空格? Format String for XML Value - Lucky Jack 如何改变字体大小呢? 如何改变字体风格? C# String小技巧 如何避免按回车键时的嗡鸣声? - Lucky Jack - 博客园 如何嵌入图片资源? Lookupedit使用小记 如何优雅的编程? 文件监视器( FileSystemWatcher) 类的使用 - Lucky Jack 反射也可以这样? - Lucky Jack - 博客园 也谈String.IsNullOrEmpty 经典的属性设置! 经典sql
浅谈对象的初始化顺序
Lucky Jack · 2008-02-22 · via 博客园 - Lucky Jack

浅谈对象的初始化顺序

当构造一个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//派生类实例构造函数

下面是简单的代码:

 1using System;
 2
 3namespace 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. //避免从构造函数中调用虚拟方法.

posted @ 2008-02-22 13:42  Lucky Jack  阅读(610)  评论(0)    收藏  举报

刷新页面返回顶部