C#构造函数在基类和父类中的执行顺序

 更新时间:2022年04月18日 13:56:36   作者:農碼一生  
这篇文章介绍了C#构造函数在基类和父类中的执行顺序,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、简介

当我们没有在子类构造函数中写上 base(),默认会先调用父类中无参的构造函数,再调用子类。
当在有参构造函数后写上base时,只调用子类构造函数中有参的构造函数,隐藏父类无参构造函数。

二、代码案例

父类代码:

#region 父类

    /// <summary>
    /// 测试构造函数——需要被构造类 Fu
    /// </summary>
    class Fu
    {
        private int x;//一个简单的私有字段
        /// <summary>
        /// 构造函数
        /// </summary>
        public Fu()
        {
            Console.WriteLine("会先调用这里:这是父类");
        }

        /// <summary>
        /// 父类中的有参构造方法
        /// </summary>
        /// <param name="x"></param>
        public Fu(int x)
        {
            this.x = x;
            Console.WriteLine("x赋值完成");
        }

        /// <summary>
        /// 父类构造C函数
        /// </summary>
        /// <param name="x"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        public Fu(int x, int b, string c)
        {
            this.x = x;
            Console.WriteLine("x赋值完成" + x + b + c);
        }


        /// <summary>
        /// 具有7个参数的构造函数
        /// </summary>
        /// <param name="a"></param>
        /// <param name="a1"></param>
        /// <param name="a2"></param>
        /// <param name="a3"></param>
        /// <param name="a4"></param>
        /// <param name="a6"></param>
        /// <param name="a5"></param>
        public Fu(int a, int a1, int a2, int a3, int a4, int a6, int a5)
        {
            Console.WriteLine("最长参数构造运行");
            Console.WriteLine(a + "|" + a1 + "|" + a2 + "|" + a3 + "|" + a4 + "|" + a5 + "|" + a6 + "|"); //在函数中让传入参数对Fu类对象进行初始化
            //例如有如下多个私有字段,在类对象初始化的时候,对其变量初始化。用构造函数最为简单
            this.a = a; //传入参数,在对象实例化后,对其私有变量进行赋值操作
            this.a1 = a;
            this.a2 = a;
            this.a3 = a;
            this.a4 = a;
            this.a5 = a;
            this.a6 = a;
        }


        private int a;
        private int a1;
        private int a2;
        private int a3;
        private int a4;
        private int a5;
        private int a6;
    }
    #endregion

子类代码:

#region 子类

    /// <summary>
    /// 派生类继承父类
    /// </summary>
    class Derived : Fu
    {
        /// <summary>
        /// 会先调用父类的构造函数,然后再调用子类这边的有参构造函数
        /// </summary>

        //先调用父类无参,再调用子类无参
        //当我们没有在子类构造函数中写上 base(),默认会先调用父类中无参的构造函数,再调用子类。

        public Derived() //: base() //重新构造 :调用父类中无参的构造函数,在这里写不写调用结果一致
        {
            Console.WriteLine("这是派生类-无参-构造函数");
        }


        private int y;


        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// 当我们没有在子类构造函数中 写上 base(),默认会先调用父类中无参的构造函数
        /// 当在有参构造函数后写上base时,只调用子类构造函数中有参的构造函数,隐藏父类无参构造函数
        public Derived(int x, int y) /*: base(x)*/
        {
            this.y = y;
            Console.WriteLine("这是y赋值完成");
        }


        /// <summary>
        /// 多参数
        /// </summary>
        /// <param name="x"></param>
        /// <param name="a"></param>
        public Derived(int x, string a)// : base(x, x, x, x, x, x, x) //这里写了 base 会先调用父类,再调用当前子类进行构造
        {
            y = x;
            Console.WriteLine(a + "第三方法");
        }
    }

    #endregion

Main()调用:

#region Main 入口
    /// <summary>
    /// 程序
    /// </summary>
    class Program
    {
        /// <summary>
        /// 主入口
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Derived d = new Derived();
            Console.WriteLine("-----------------------以上为无参构造------------------------------------------");
            Derived d1 = new Derived(1, 2);
            Console.WriteLine("-----------------------以上为2个参数构造---------------------------------------");
            Derived d2 = new Derived(1, "1");
            Console.WriteLine("-----------------------以上为2个参数构造,6个私变量----------------------------");

            //先调用有参的构造函数一旦被调用,无参的构造函数都不会被调用了
            //先执行父类的构造函数,才执行子类的
            Console.ReadLine();
        }
    }
    #endregion

三、输出结果

会先调用这里:这是父类
这是派生类-无参-构造函数
-----------------------以上为无参构造------------------------------------------
会先调用这里:这是父类
这是y赋值完成
-----------------------以上为2个参数构造---------------------------------------
最长参数构造运行
1|1|1|1|1|1|1|
1第三方法
-----------------------以上为2个参数构造,6个私变量----------------------------

到此这篇关于C#构造函数在基类和父类中执行顺序的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C# PictureBox控件方法参数及图片删除重命名上传详解

    C# PictureBox控件方法参数及图片删除重命名上传详解

    这篇文章主要为大家介绍了C# PictureBox控件方法参数及图片删除重命名上传示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • C#实现梳排序的使用示例

    C#实现梳排序的使用示例

    梳排序算法是一种改进的冒泡排序算法,它通过调整冒泡排序的间隔来提高排序的效率,本文主要介绍了C#实现梳排序的使用示例,感兴趣的可以了解一下
    2023-11-11
  • C#毕业设计之Winform零压健身房管理系统

    C#毕业设计之Winform零压健身房管理系统

    本文介绍了个人的《零压健身房管理系统(扁平化)》的基本流程和功能点的介绍,虚心接受各位的意见,欢迎在提出宝贵的意见,大家一起探讨学习
    2021-09-09
  • C#利用异或算法实现加密解密

    C#利用异或算法实现加密解密

    这篇文章主要为大家详细介绍了C#如何利用异或算法实现加密解密的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-01-01
  • C#中Linq的去重方式Distinct详解

    C#中Linq的去重方式Distinct详解

    本文详细讲解了C#中Linq的去重方式Distinct,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C#处理JPEG头信息的方法

    C#处理JPEG头信息的方法

    相信大家肯定都看过用C或C++处理JPEG头信息的程序了,我也看了,不过因为我不懂C,看得我头疼。所以我还是决定用C#来写吧
    2013-05-05
  • C#中的DataSet、string、DataTable、对象转换成Json的实现代码

    C#中的DataSet、string、DataTable、对象转换成Json的实现代码

    这篇文章主要介绍了C#中的DataSet、string、DataTable、对象转换成Json的实现代码,需要的朋友可以参考下
    2014-09-09
  • 浅谈C#中的常量、类型推断和作用域

    浅谈C#中的常量、类型推断和作用域

    这篇文章主要介绍了C#中的常量、类型推断和作用域,有需要的朋友可以参考一下
    2013-12-12
  • DevExpress之SplashScreen用法实例

    DevExpress之SplashScreen用法实例

    这篇文章主要介绍了DevExpress中SplashScreen的用法,对于C#初学者有很好的参考借鉴价值,需要的朋友可以参考下
    2014-08-08
  • 深入了解c# 信号量和互斥体

    深入了解c# 信号量和互斥体

    这篇文章主要介绍了c# 信号量和互斥体的相关资料,文中讲解非常细致,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07

最新评论