C#构造函数的执行顺序

<1>.Net中当子类被请求时,会先实例化父类。先建立父类的字段,然后是构造函数。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 构造函数的执行顺序
{
    public class MyBaseClass
    {
        public MyBaseClass()
        {
            Console.Write("调用父类无参数的构造函数");
        }

        public MyBaseClass(int i)
        {
            Console.Write("调用父类一个参数的构造函数");
        }
    }


    public class MyDerivedClass : MyBaseClass
    {
        public int age;
        public static int age2;//只要类里存在静态变量。那么静态变量总是最先初始化的。

        static MyDerivedClass() //既然要初始化静态变量,就要调用静态的构造函数。
        {
            age2 = 100;
            Console.Write(age2);

        }


        public MyDerivedClass():this(5)
        {
            age = 101;
            Console.WriteLine(age);
        }

        public MyDerivedClass(int i)
        {
            age = 102;
            Console.WriteLine(age);
        }

        public MyDerivedClass(int i, int j)
        {
            Console.WriteLine("两个变量的参数");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyDerivedClass myder = new MyDerivedClass(); //输出100 ,"调用父类无参数的构造函数",101
			/*
			
            执行顺序:
			<1>: static MyDerivedClass() 
			<2>: public MyBaseClass() 
			<3>:public MyDerivedClass()

			*/

            //---------------------------------------------------------------------------------------------

            MyDerivedClass myder2 = new MyDerivedClass(5); //输出"调用父类无参数的构造函数",102。
			/*
			
            在初始化myder对象的时候已经初始化过静态变量age2了。因为静态构造函数最多执行一次,所以初始化myder2对象的时候就不会在继续初始化静态变量age2了
            执行顺序:<1>: public MyBaseClass() <2>: public MyDerivedClass(int i)

            
            假如我想在初始化myder2对象的时候调用父类带有一个参数的构造函数怎么办呢?很好办只要在派生类的构造函数后面加一个:base(i)
              
			base 关键字用于从派生类中访问基类的成员;指定创建派生类实例时应调用的基类构造函数。
             
            public MyDerivedClass(int i):base(i)
            {
               age = 102;
               Console.WriteLine(age);
            }
            
            执行顺序:<1>: public MyBaseClass(int i) <2>: public MyDerivedClass(int i)
            顾这里输出的是 "调用父类一个参数的构造函数",102
            
			*/


            //---------------------------------------------------------------------------------------------

            MyDerivedClass myder3 = new MyDerivedClass(5, 6); //输出"调用父类无参数的构造函数","两个变量的参数"
			
			/*
			
            执行顺序:
			<1>: public MyBaseClass() 
			<2>: public MyDerivedClass(int i, int j)
			
			*/



            Console.ReadKey();
        }
    }
}



<2> 含this 与base的构造函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 构造函数的执行顺序
{
    public class MyBaseClass
    {
        public MyBaseClass()
        {
            Console.Write("调用父类无参数的构造函数");
        }

        public MyBaseClass(int x)
        {
            Console.Write("调用父类一个参数的构造函数");
        }
    }


    public class MyDerivedClass : MyBaseClass
    {
        public int age;
        public static int age2;//只要类里存在静态变量。那么静态变量总是最先初始化的。

        static MyDerivedClass() //既然要初始化静态变量,就要调用静态的构造函数。
        {
            age2 = 100;
            Console.Write(age2);

        }


        public MyDerivedClass():this(5)
        {
            age = 101;
            Console.WriteLine(age);
        }


        public MyDerivedClass(int i):base(i)
        {
            age = 102;
            Console.WriteLine(age);
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            MyDerivedClass myder = new MyDerivedClass(); //输出100 ,"调用父类一个参数的构造函数",102,101
			/*
            执行顺序:
			<1>:static MyDerivedClass() 
			<2>:public MyBaseClass(int x) 
			<3>:public MyDerivedClass(int i) 
			<4>:public MyDerivedClass()
			
            

            public MyDerivedClass():this(5) 这个this(5),就表示在调用public MyDerivedClass()构造函数前,先调用当
            前类中带一个参数的构造函数,即先调用public MyDerivedClass(int i) ,而MyDerivedClass类中存在一个静态变量,
            静态变量肯定是最先被初始化的,所以最先被调用的就是静态构造函数	static MyDerivedClass()。
 
	        执行完静态构造函数后,接下来"应该"是执行public MyDerivedClass(int i),而public MyDerivedClass(int i)
            是在MyDerivedClass类里面的,而MyDerivedClass类是MyBaseClass的一个派生类,所以它又要先调用父类MyBaseClas的默认
            构造函数,即:public MyBaseClass(),然后再调用public MyDerivedClass(int i),最后再调用public MyDerivedClass()。
                
	        所以它的默认执行顺序是:
            <1>: static MyDerivedClass() <2>:public MyBaseClass() <3>:public MyDerivedClass(int i) 
            <4>:public MyDerivedClass()


            此时情况出现了。public MyDerivedClass(int i)这个构造函数后面有一个:base(i) 。而这个base(i)的意思就是指定
            调用父类带一个参数的构造函数,而不是调用不带参数的默认构造函数了。

            所以它的执行顺序是
            <1>:static MyDerivedClass() 
			<2>:public MyBaseClass(int x)  
			<3>:public MyDerivedClass(int i) 
            <4>:public MyDerivedClass()
             
            */  
            
            Console.ReadKey();
        }
    }
}



 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值