c#的構造器分為三種
類型構造器
執行個體構造器 (參考型別,和實值型別分別進行講述)
參考型別的執行個體構造器 :
在建立類的執行個體的時候有下邊三個步驟要做 1 分配資料欄位的的記憶體 2 分配執行個體的系統開銷記憶體(執行個體的指標,以及同步塊索引) 2 調用構造器初始化執行個體的狀態。
1 構造器不能被繼承
2 如果沒有顯示聲明類的構造器,那麼clr自動構建一個無參的構造器。
3 構造器的可訪問性為public。
4 一個類可以有多個執行個體構造器。 可以有不同的存取層級。
5 類的構造器在訪問從基類繼承過來的欄位之前,必須調用基類的構造器。
6c#編譯器提供了一種便利的文法: 為欄位類型初始話 。
例如 : string str = “fuck” ;//碰到這種情況,要和建構函式聯絡起來考慮, 沒有多大的實際意義,但是對你理解clr有好處
相當於string str ; 然後在建構函式裡面 給欄位賦值 str = “fuck” ;
這樣那,你如果定義了多個構造器,那麼在每個構造器裡面都有 str = “fuck” ;這句話,會造成程式集變大,為了避免這種情況,我們在寫程式的時候可以定義一個基準的建構函式,在這個建構函式裡面對每個建構函式都要操作的欄位進行賦值 ,然後在其他的建構函式裡面調用這個基準的建構函式。具體的情況請參考下列的代碼?
//學習this來調用建構函式sealed class secsonClass:baseClass{private string age ; //年紀private string height; //體重private string name ;public secsonClass() {age = "10" ;height = "100" ;name ="cicnor";}public secsonClass(string name):this() // 把這個函數看明白了,我上邊說的那個情況你就明白了。{name ="cicn";}}
參考型別的構造器函數我學習的過程的代碼如下,請大家參考
using System;using System.Data;using System.Text;namespace myStu{/* c#中執行個體構造器的學習作用 : 初始化類的執行個體 ,使類的執行個體處於一個可以使用的狀態。調用 : 當類進行執行個體化的時候調用構造器,具體點說就是使用new的時候。構造器被複製的時候是不調用構造器的注意的幾點 1 建構函式不能被繼承。2 繼承類的建構函式可以指定父類的建構函式3 如果繼承類的建構函式沒有指定父類的建構函式,那麼就調用父類的無參建構函式。*/ /* 當執行個體化繼承類的執行個體時候 ,1 首先是調用的基類的類型建構函式, 2 然後調用執行個體構造器, 3 最後調用子類的執行個體建構函式。如果繼承類也有類型構造器,那麼首先是調用繼承類的類型構造器 順序如下1繼承類的類型構造器 (為什麼首先調用繼承類的類型構造器??? 有時間解決一下這個問題)2基類的類型構造器baseClass3基類的構造器3繼承類的構造器*/class programe{ static void Main(string[] arg){try{ sonClass obj = new sonClass("") ; }catch (Exception err){Console.WriteLine(err.Message);}}} internal class baseClass {static string className;string instanceName;//基類的預設構造器public baseClass(){instanceName = "" ;Console.WriteLine("基類的構造器") ;}//基類的帶參構造器public baseClass(string name){instanceName = name ;Console.WriteLine("基類的帶參構造器") ;}//類型構造器static baseClass(){className = "baseClass" ;Console.WriteLine("基類的類型構造器" + className) ;//instanceName = "" ;} }//internal class sonClass :baseClass{//構造器不能被繼承 必須指定子類的構造器調用父類的那個構造器,可以隱士調用,也可以顯示調用父類的構造器。//注意 : 這樣不是說明構造器可以被繼承,而是說顯示調用了父類的那個構造器。 public sonClass(string name ){Console.WriteLine("繼承類的構造器") ;}static sonClass(){Console.WriteLine("繼承類的類型構造器") ;}}//學習this來調用建構函式sealed class secsonClass:baseClass{private string age ; //年紀private string height; //體重private string name ; //如果父類有多個建構函式,那麼這裡是調用的那個基類的建構函式那?//經過實驗證明 這裡隱式調用的是父類的無參建構函式。//總結一句話 : 建構函式都會隱式調用父類的無參構造器。除非顯示指定父類的構造器。public secsonClass( ) {age = "10" ;height = "100" ;name ="cicnor";}//這裡有一個疑問 , 顯示調用了,secsonClass 這個函數,我還可以顯示調用基類的建構函式嗎?public secsonClass(string name):this() {name ="cicn";}}}
運行結果如下 :
---------- run ----------=============== 運行C#程式 Write By 森晉科技===============繼承類的類型構造器基類的類型構造器baseClass基類的構造器繼承類的構造器=============== 程式結束 Copy cicnor 2001===============Output completed (0 sec consumed) - Normal Termination