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

推荐订阅源

Attack and Defense Labs
Attack and Defense Labs
T
Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hackread – Cybersecurity News, Data Breaches, AI and More
I
Intezer
C
Cyber Attacks, Cyber Crime and Cyber Security
The Register - Security
The Register - Security
量子位
Security Latest
Security Latest
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
MyScale Blog
MyScale Blog
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
Spread Privacy
Spread Privacy
Jina AI
Jina AI
博客园 - 【当耐特】
P
Palo Alto Networks Blog
Last Week in AI
Last Week in AI
SecWiki News
SecWiki News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
G
GRAHAM CLULEY
宝玉的分享
宝玉的分享
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
The Blog of Author Tim Ferriss
V
Vulnerabilities – Threatpost
有赞技术团队
有赞技术团队
T
Tor Project blog
H
Hacker News: Front Page
A
Arctic Wolf
NISL@THU
NISL@THU
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
Engineering at Meta
Engineering at Meta
V
V2EX
N
News and Events Feed by Topic
Webroot Blog
Webroot Blog
Know Your Adversary
Know Your Adversary
P
Privacy International News Feed
I
InfoQ
D
Docker
L
LINUX DO - 最新话题
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
U
Unit 42

博客园 - 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)    收藏  举报

刷新页面返回顶部