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

對於經本博主明確授權和許可使用文章及內容的,使用時請注明文章或內容出處並注明網址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM