http://blog.csdn.net/huangcailian/article/details/25958967

一、成员初始化整体顺序

1.成员赋值初始化先于构造函数;
2.成员赋值初始先从子类再到基类;
3.构造函数初始化先从基类再到子类;
4.静态成员初始化优先于实例成员初始化;

二、对类型静态成员构造的大致过程

1.分配静态成员的内存空间,此时空间存储数据为0;
2.执行类的静态成员的初始化语句;
3.执行类的静态构造函数。

三、对类型实例成员构造的大致过程

1.分配实例成员的内存空间,此时空间存储数据为0;
2.执行子类实例成员初始化语句;
3.执行基类实例化成员初始化语句;
4.执行基类构造函数;
5.执行子类构造函数;

四、同时有静态成员和实例成员的大致构造过程

1.执行子类静态成员初始化语句;
2.执行子类静态构造函数;
3.执行子类实例成员初始化语句;
4.执行基类静态成员初始化语句;
5.执行基类静态构造函数;
6.执行基类实例成员初始化语句;
7.执行基类实例构造函数;
8.执行子类实例构造函数。

五、说明

1.C#中静态构造函数都是私有的,不能为其添加访问修饰符;
2.只有创建类的实例或调用任何静态成员时才能激发静态构造函数;
3.调用一个未初始化类的静态成员时,他会先去初始化这个类的静态成员和静态构造函数。
 
using System;
using System.Diagnostics;
using System.Text; class Test
{
class CTEST
{ }
class SINGLE_TON
{
public static float sfx = ; //
public static CTEST ot = new CTEST();//
private float fx = ;
static private double dx = 100.03;//
private string s = "hello";
//public static readonly SINGLE_TON Instance = new SINGLE_TON();//加上这句就比较特殊了,这里虽有构造操作,但必须等到所有成员初始完成后才会进行
public static int x;//
public string str;
protected int y = ;
public SINGLE_TON()
{
Console.WriteLine("private single_ton");
} //静态构造函数最会多只会被调用一次,在首次访问类的静态成员变量或生成类的实例时被调用。 static SINGLE_TON()
{
Console.WriteLine("static single_ton");
} public void dosth()
{
Console.WriteLine("do some thing");
}
}
static void Main()
{
//首次访问类的静态变量,编译器首先会对所有有初始值的静态变量进行赋值操作,如1和2,3处。
//然后调用静态构造函数。
//不会对非静态变量进行赋值。不过它们都有默认值,数值类型为0,引用类型为null
int x = SINGLE_TON.x;
// SINGLE_TON.Instance.dosth();
// SINGLE_TON.Instance.dosth();
// SINGLE_TON.Instance.dosth(); //生成类实例时,编译器首先会对所有有初始值的静态变量进行赋值操作,如1和2,3处。
//然后调用静态构造函数。
//然后才对有初始值的非静态变量进行赋值。
//然后调用普通构造函数。
SINGLE_TON sg = new SINGLE_TON();
} //输出结果:
// private single_ton
// static single_ton
// do some thing
// do some thing
// do some thing }

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

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

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

  2. Java中的初始化顺序(静态成员、静态初始化块,普通成员、普通初始化块、构造函数)

    本文链接    http://blog.csdn.net/xiaodongrush/article/details/29170099 參考文章     http://my.oschina.net/le ...

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

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

  4. [java] java中的初始化顺序

    先看程序: package init_cls; class A{ {System.out.println("i am in the class A!");} static { Sy ...

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

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

  6. Java类继承关系中的初始化顺序

    Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...

  7. Java类成员初始化顺序

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

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

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

  9. C++中类成员变量在初始化列表中的初始化顺序

    引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的. 先看代码: class TestClass1 { public: TestClass1() { cout << ...

随机推荐

  1. 解决SSIS中的脚本任务无法调试的问题

    开发环境:操作系统环境为Win7 64Bit,数据库为SQLServer2008R2 问题现象:在SSIS的项目工程中,新建Package包,新建脚本任务,编写脚本程序以后,设置断点无法调试(Debu ...

  2. 使用VideoView自定义一个播放器控件

    介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actv ...

  3. 用二进制大对象类型Blob实现图片入库与出库的操作

    package readclobDemo.bao; import java.io.FileInputStream; import java.io.FileNotFoundException; impo ...

  4. iOS中 @synthesize 和 @dynamic 区别

    OC object-c 为了让java的开发者习惯 使用.的操作,所以可以将接口类中的变量 使用@property来声明属性.但是在.h中声明的属性,必须在.m中使用@synthesize或者@dyn ...

  5. iOS 秒数转换成时间,时,分,秒

    //转换成时分秒 - (NSString *)timeFormatted:(int)totalSeconds{ int seconds = totalSeconds % 60;     int min ...

  6. android 之 ExpandableListView列表中的列表

    有时候,我们需要设计这样一个界面,外面有一个列表,当我们点击其中列表中的某个条目时,就会展开这个条目,出现一个新的列表.比如下图:(程序运行的效果图,在这里贴出来) 当我们点击第一项时,视图变为: - ...

  7. Linux下恢复删除的文件

    转自:http://github.tiankonguse.com/blog/2015/09/13/linux-remove-recovery/ 下午, DBA找我说有些SQL执行了两个小时了,导致主从 ...

  8. LVS入门

    说到大型网站的架构,就必然要谈到LVS.LVS即:Linux Virtual Server,是由国人章文嵩博士所创立的,已经被加入到了Linux 2.6的内核模块中了.官方网址: http://www ...

  9. MyCat 学习笔记 第十三篇.数据分片 之 通过HINT执行存储过程

    1 环境说明 VM 模拟3台MYSQL 5.6 服务器 VM1 192.168.31.187:3307 VM2 192.168.31.212:3307 VM3 192.168.31.150:  330 ...

  10. jQuery form插件的使用--用 formData 参数校验表单,验证后提交(简单验证).

    Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.引入依赖js <script src=& ...