標籤: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#建構函式的執行順序