C#中成员初始化顺序

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 = 1; //1
        public static CTEST ot = new CTEST();//2
        private float fx = 13;
        static private double dx = 100.03;//3
        private string s = "hello";
        //public static readonly SINGLE_TON Instance = new SINGLE_TON();//加上这句就比较特殊了,这里虽有构造操作,但必须等到所有成员初始完成后才会进行
        public static int x;//22
        public string str;
        protected int y = 123;
        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

}
原文地址:https://www.cnblogs.com/timeObjserver/p/6028308.html