码迷,mamicode.com
首页 > 其他好文 > 详细

C#构造函数的执行顺序

时间:2014-09-12 19:14:04      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:c#构造函数的执行顺序

<1>

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>

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);
        }

        public MyDerivedClass(int i, int j)
        {
            Console.WriteLine("两个变量的参数");
        }
    }
    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()



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

            //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();
        }
    }
}


C#构造函数的执行顺序

标签:c#构造函数的执行顺序

原文地址:http://blog.csdn.net/fanbin168/article/details/39232945

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!