c#構造器的一點理解(一)

來源:互聯網
上載者:User
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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.