• C#构造函数详解


    构造函数


    本文提供全流程,中文翻译。

    Chinar 坚持将简单的生活方式,带给世人!

    (拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)



    Chinar —— 心分享、心创新!

    助力快速理解 构造函数的用法、详解

    为新手节省宝贵的时间,避免采坑!



    全文高清图片,点击即可放大观看 (很多人竟然不知道)


    1

    Constructor —— 构造函数


    Constructor 构造函数,基本用法是在类对象声明的时候完成初始化工作

    我们以 C# 为例:来简单了解一下构造函数的声明方式
    举个栗子黑白88

        class Chinar
        {
            private int    a = 1;
            private int    b = 1;
            private string c = "Chinar";
            private object d = 666;
    
    
            //构造函数用来完成 —— 初始化工作
            public Chinar() //声明一个名称与类名一样的函数,就是构造函数(可以传你所需要的参数,写你所需的方法)
            {
                //每个类,本身默认有一个。如果我们不写明这个  public Chinar()函数,系统仅调用系统默认的。
                //自定义构造 public Chinar()函数后,系统只会调用自定义的 Chinar()
            }
    
    
            //这是一个多参数的构造函数
            public Chinar(int a, int b, string c, object d)
            {
            }
        }

    2

    Fu —— 测试类:Fu


    如何用构造函数完成初始化工作

    用下面两个例子完全说明

    类:Fu 中有多个构造函数,在声明类对象时,如果调用构造函数,会对其内部私有变量进行初始化操作
    举个栗子黑白88

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

    3

    Derived —— 派生类继承自:Fu


    书写这个派生类,是为了让新手明白在复杂情况下 base 的具体作用及用法

    类: Derived 继承 Fu

    base :具体作用

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

    当在有参构造函数后写上base时,只调用子类构造函数中有参的构造函数,隐藏父类无参构造函数
    举个栗子黑白88

        /// <summary>
        /// 派生类继承父类
        /// </summary>
        class Derived : Fu
        {
            /// <summary>
            /// 会先调用父类的构造函数,然后再调用子类这边的有参构造函数
            /// </summary>
            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 + "第三方法");
            }

    4

    Initialize Constructor —— 初始化,调用构造


    实例化类对象,并调用不同构造函数,去构造初始化对象

    系统会根据参数的不同,进行不同的构造函数,从而达到初始化效果
    举个栗子黑白88

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

    输出结果:

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

    支持

    May Be —— 搞开发,总有一天要做的事!


    拥有自己的服务器,无需再找攻略!

    Chinar 提供一站式教程,闭眼式创建!

    为新手节省宝贵时间,避免采坑!


    先点击领取 —— 阿里全产品优惠券 (享受最低优惠)


    1 —— 云服务器超全购买流程 (新手必备!)

    2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

    3—— Windows 服务器配置、运行、建站一条龙 !

    4 —— Linux 服务器配置、运行、建站一条龙 !





    技术交流群:806091680 ! Chinar 欢迎你的加入


    END

    本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

    对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

    对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

  • 相关阅读:
    mysql 导入CSV数据 [转]
    Linux用户态程序计时方式详解[转]
    [转] Bash脚本:怎样一行行地读文件(最好和最坏的方法)
    第二次作业
    软件工程原理与方法 第一次作业
    2017-02-19,周日整理
    2017-02-12,周日整理
    cnblogs,第一次博客纪念。
    堆和栈的区别(转过无数次的文章)
    Flash Player版本相关问题
  • 原文地址:https://www.cnblogs.com/chinarbolg/p/9601402.html
Copyright © 2020-2023  润新知