NET中对象的构建过程

     本节主要介绍一个对象构造的过程,看下面的代码:

public abstract class A
    {
        private static int s = 10;//1.5

        private int m = 5;//1.7

        static A() //1.6
        {
            Console.WriteLine("A");
        }
        public A()//1.8
        {
            Say();
        }

        public abstract void Say();
    }


    public class B : A
    {
        private static int mCount = 0;//1.1

        private int x = 1;//1.3

        private int y = 2;//1.4

        static B()//1.2
        {
            Console.WriteLine("B");
        }

        public B()//1.9
        {
            x = 1;
            y = 1;
            mCount++;
        }

        public override void Say()
        {
            Console.WriteLine("x={0},y={1},count={2}",x,y,mCount);
        }
    }
Main函数代码:
static void Main(string[] args)
        {
            B b1 = new B();//我在上面的代码中用1.*标出了该语句的构造顺序

            B b2 = new B();

            Console.Read();
        }

运行结果如下:

Q1XO_NSMUX1MZKZKFP8A0M3

总结:

1,对象构造的顺序遵循如下原则:

1.1 先从要new 的类的静态成员开始构造,静态成员中,先构造静态成员变量,再执行静态构造函数。

1.2 接着构造要new的类的实例成员变量。

1.3 接着调用要new的类的实例构造函数,注意:在执行该实例构造函数前,会先激发基类的构造过程,基类的构造过程又会从1.1开始。

基类构造完毕后才会执行该实例构造函数。

可以这样理解:执行实例构造函数时意味着要真正创建类的实例了,但是这时父类还没有构造了,焉能先构造子类?

所以就要暂停执行子类的实例构造函数,转而启动父类的构造过程。

1.4 废话:静态成员变量只会构造一次,静态构造函数只会执行一次。

总结成一句话就是:先静态,后实例,先成员变量,后构造函数,实例构造函数激发类的递归构造。

原文地址:https://www.cnblogs.com/imap/p/2736279.html