程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#構造函數的執行順序

C#構造函數的執行順序

編輯:C#入門知識

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


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved