首先我们来看看引用类型的成员初始化过程

我们来看一个例子吧

class Program {     static void Main(string[] args)     {         DriveB d = new DriveB();     } }

class BaseA {     static DisplayClass a = new DisplayClass("基类静态成员初始化");

DisplayClass BaseA_c = new DisplayClass("基类实例变量BaseA_c初始化");

public BaseA()     {         Console.WriteLine("基类构造方法被调用");     } }

class DriveB : BaseA {     static DisplayClass DriveB_b = new DisplayClass("继承类静态成员DriveB_b初始化");

//static BaseA DriveB_a = new BaseA();

DisplayClass DriveB_c = new DisplayClass("继承类实例变量DriveB_c初始化");

public DriveB()     {         Console.WriteLine("继承类构造方法被调用");     } } class DisplayClass {     public DisplayClass(string diplayString)     {         Console.WriteLine(diplayString);         Console.WriteLine();     } } 程序动行的结果是: 继承类静态成员DriveB_b初始化 继承类实例变量DriveB_c初始化 基类静态成员初始化 基类实例变量BaseA_c初始化 基类构造方法被调用 继承类构造方法被调用

得出初始化顺序结论:

1)继承类静态成员变量初始化  2)继承类实例变量初始化  3)基类静态静态成员变量初始化  4)基类实例变量初始化  5)基类构造方法调用  6)继承类构造方法调用。

好像结果和JAVA的有点不一样啊, 有点混乱的感觉,搞不懂M$为什么要让初始化按这样的顺序执行,像JAVA那样严格的从基类到派生类多好呀.上例的运行结果说明, 构造函数这么这个和我们通常思路执行的顺序还是有一定的差别.对于实例成员初始化,基本上就是以下步骤执行: 1 类的对象初始化大体顺序上实例成员赋值到构造函数 2 成员赋值初始化按照由子类到父类的顺序 3 构造函数的初始化按照由父类到子类的顺序 从这里我们有一点需要注意的是,因为成员赋值初始化是从子类到父类的,所以在子类的成员赋值初始化的过程中,不要引用父类定义的成员,因为这个时候父类成员还没有开始初始化.需要说明一点的是C#在创建对象的第一步分配内存完成后会动把所有实例成员变量初始化成变量的默认值,例如整型就是0,引用类型就是null.然后才开始进行成员变量初始化的过程.

C#对象初始化

1.     先变量后构造函数。变量先被初始化,然后构造函数被执行

2.     先静态化后实例化。当一个类被访问时,静态变量和构造函数最先被初始化.接着是对象的实例化变量和构造函数被初始化

3.     先派生类后基类。对于变量和静态构造函数,派生对象在基对象之前被初始化.比如C类派生自B类,B类派生自A类,那么变量和静态构造函数被初始化次序是C-B-A.

4.     除了实例构造函数。对于实例构造函数,基类构造函数在派生类构造函数之前执行,实例构造函数被执行次序是A-B-C.

5.     不要假定变量的次序。Fields依据它们在源文件中的声明的顺序依次初始化.然而,自从程序员和工具可以随意安排变量的声明后,你不应该在依靠变量任何特别的次序初始化

6.     对虚方法用两个阶段的构建。避免从一个构造器调用虚方法. 如果在初始化一个对象时需要调用一些虚方法,应在完整构造该对象的地方使用两阶段的构建,并随后调用已构造对象的初始化方法。

C#类的成员初始化顺序的更多相关文章

  1. Java类的成员初始化顺序

    Java类的成员初始化顺序 2017-06-01 代码: public class InitializeSequence { public static void main(String[] args ...

  2. java类的成员初始化顺序和初始化块知识

    java类的成员初始化顺序和初始化块知识 转自:http://blog.csdn.net/lgfeng218/article/details/7606735 属性.方法.构造方法和自由块都是类中的成员 ...

  3. 11.c#类的成员初始化顺序

    转自http://www.cnblogs.com/siceblue/archive/2009/01/15/1376430.html C#作为一种纯面向对象的话言,为它编写的整个代码里面到处都离不开对象 ...

  4. Java 类的成员初始化顺序

    做个简单笔录,就当是重温下基础知识. 1.先看代码: package com.test; public class Test { public static void main(String[] ar ...

  5. Java类成员初始化顺序

    类中包含7中成员:1.静态变量 static2.final静态常量 final static3.静态代码块 static{}  //多个代码块顺序执行 4.普通变量5.普通代码块 {}  //多个代码 ...

  6. C++成员初始化顺序

    #include <iostream> using namespace std; int seti() {cout << "seti" << e ...

  7. C#中成员初始化顺序

    http://blog.csdn.net/huangcailian/article/details/25958967 一.成员初始化整体顺序 1.成员赋值初始化先于构造函数: 2.成员赋值初始先从子类 ...

  8. Java中的成员初始化顺序和内存分配过程

    Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...

  9. java中的多构造函数以及类字段的初始化顺序

    1.同一个类可以有多个构造函数,多个构造函数之间通过参数来区分.这是方法重载的一个实例.构造函数之间可以相互调用. 2.类的初始化块:可以在类中使用“{”和“}”将语句包围起来,直接将其作为类的成员. ...

随机推荐

  1. CDB和PDB基本管理

    CDB和PDB基本管理 这篇文章主要介绍CDB和PDB的基本管理,资料来源oracle官方. 基本概念: Multitenant Environment:多租户环境 CDB(Container Dat ...

  2. 【LeetCode】139 - Word Break

    Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...

  3. 推荐一款C#反编译软件(开源)

    大二的时候老师要求做过一个小项目,大概4个人左右一组.当时交流不是特别到位,项目在一个同学的电脑上建成了就一直在他的电脑上(所以好东西不要烂在你的硬盘里),也不知道什么源码管理,可悲到项目做完我还没有 ...

  4. Hadoop 2 初探

    Hadoop 2.6.0的安装略复杂,在一台既有Hadoop 1又有Hadoop 2的server上,要设置好环境变量,必要时候echo $HADOOP_HOME一下看运行的是哪个版本. Master ...

  5. 解决ext时间插件在谷歌下变宽的BUG

    在做一个项目时候遇到EXT这么一个问题,现分享出解决问题的代码 Ext.override(Ext.menu.DateMenu, { render: function () { Ext.menu.Dat ...

  6. [转] Web 前端优化最佳实践之 Mobile(iPhone) 篇

    原文链接:http://dbanotes.net/web/best_practices_for_speeding_up_your_web_site_server_mobile.html Web 前端优 ...

  7. 使用HttpClient实现文件的上传下载

    1 HTTP HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源. 虽然在 JDK 的 java.net ...

  8. searchDisplayController 时引起的数组越界

    当  [searchDisplayController.searchResultsTableView setSeparatorStyle:UITableViewCellSeparatorStyleNo ...

  9. SharePoint咨询师之路:备份和恢复系列--制定备份计划

    本来想研究下如何做数据库服务器的集群,然而突然被同事问起如何在部署SharePoint服务场的时候做备份和恢复的计划,就先来复习和研究一下. 本系列包括: 备份服务器场和配置 备份web和服务应用程序 ...

  10. Dagger2 scope

    1. 一个没有scope的component是不能依赖于另外一个有scope的component 2.@Singleton不是真正意义的单例,比如下面 @Singleton @Component cl ...