最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#類繼承中構造函數(shù)的執(zhí)行序列示例詳解

 更新時間:2018年09月11日 14:49:09   作者:yixuan.han  
這篇文章主要給大家介紹了關于C#類繼承中構造函數(shù)的執(zhí)行序列的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

大家都知道類的繼承規(guī)則:

1、派生類自動包含基類的所有成員。但對于基類的私有成員,派生類雖然繼承了,但是不能在派生類中訪問。

2、所有的類都是按照繼承鏈從頂層基類開始向下順序構造。最頂層的基類是System.Object類,所有的類都隱式派生于它。只要記住這條規(guī)則,就能理解派生類在實例化時對構造函數(shù)的調(diào)用過程。

不知道大家在使用繼承的過程中有木有遇到過調(diào)用構造函數(shù)時沒有按照我們預期的那樣執(zhí)行呢?一般情況下,出現(xiàn)這樣的問題往往是因為類繼承結構中的某個基類沒有被正確實例化,或者沒有正確給基類構造函數(shù)提供信息,如果理解在對象生命周期的這個階段發(fā)生的事情,將更利于解決此類問題。

為了實例化派生的類,必須先實例化它的基類。而要實例化這個基類。又必須要實例化這個基類的基類,這樣一直到實例化System.Object(所有類的跟)為止,結果無論使用什么構造函數(shù)實例化一個類,總是首先調(diào)用System.Object.Object() .

下面一個示例演示執(zhí)行順序:

基類:

public class MyBaseClass
 {
  public MyBaseClass()
  {
   Console.WriteLine("I am MyBaseClass()");
  } 
  public MyBaseClass(int i)
  {
   Console.WriteLine("I am MyBaseClass(int i)");
  }            
 }

派生類:

public MyDerivedClass()
  {
   Console.WriteLine("I am MyDerivedCalss()");
  }
  public MyDerivedClass(int i)
  {
   Console.WriteLine("I am MyDerivedClass(int i)");
  }
  public MyDerivedClass(int i,int j)
  {
   Console.WriteLine("I am MyDerivedClass(int i,int j)");
  }

接下來我們在Main函數(shù)中以不帶參數(shù)的構造函數(shù)實例化MyDerivedClass:

 MyDerivedClass myObj = new MyDerivedClass();

運行程序,控制臺輸出如下:

從結果可以看出,執(zhí)行順序先是基類構造的函數(shù),接下來才是派生類的構造函數(shù),即

1.執(zhí)行System.Object.Object()構造函數(shù)(Object比較特殊,所有類的基類,一般可以不考慮,但是得知道它也是被執(zhí)行了的)

2.執(zhí)行MyBaseClass.MyBaseClass()構造函數(shù)

3.執(zhí)行MyDerivedClass.MyDerivedClass()構造函數(shù)

如果我們以帶一個參數(shù)的構造函數(shù)實例化MyDerivedClass:

 MyDerivedClass myObj = new MyDerivedClass(4);

運行程序,控制臺輸出如下:

可以看出執(zhí)行順序如下:

1.執(zhí)行System.Object.Object()構造函數(shù)

2.執(zhí)行MyBaseClass.MyBaseClass()構造函數(shù)

3.執(zhí)行MyDerivedClass.MyDerivedClass(int i)構造函數(shù)

同理如果我們以帶兩個參數(shù)的構造函數(shù)實例化MyDerivedClass

 MyDerivedClass myObj = new MyDerivedClass(4,8);

運行程序,控制臺輸出如下:

可以看出執(zhí)行順序如下:

1.執(zhí)行System.Object.Object()構造函數(shù)

2.執(zhí)行MyBaseClass.MyBaseClass()構造函數(shù)

3.執(zhí)行MyDerivedClass.MyDerivedClass(int i,int j)構造函數(shù)

大多數(shù)情況下這個都能正常工作,但是有時我們需要對發(fā)生的事件進行更多的控制。比如我們想得到如下所示的執(zhí)行順序:

1.執(zhí)行System.Object.Object()構造函數(shù)

2.執(zhí)行MyBaseClass.MyBaseClass(int i)構造函數(shù)

3.執(zhí)行MyDerivedClass.MyDerivedClass(int i,int j)構造函數(shù)

使用這個順序,可以把使用int i參數(shù)的代碼放到MyBaseClass(int i)中,MyDerivedClass(int i,int j)只需要處理int j(假設int i參數(shù)在MyBaseClass和 MyDerivedClass里含義是一樣的)

為此,只需要使用構造函數(shù)初始化器,把代碼放到方法定義的冒號后面,如在派生類的構造函數(shù)中指定所使用的基類的構造函數(shù),如下所示:

 public MyDerivedClass(int i,int j) : base(i)
  {
   Console.WriteLine("I am MyDerivedClass(int i,int j)");
  }

其中,base關鍵字指定在實例化過程中使用具有指定參數(shù)的構造函數(shù)。這里使用了int參數(shù),其值通過i傳遞給MyDerivedClass構造函數(shù),所以將使用MyBaseClass(int i) ,這樣就不會調(diào)用MyBaseClass()了,我們重新執(zhí)行下前面兩個參數(shù)的實例化代碼,就可以看出執(zhí)行結果確實如此:

除了base關鍵字,還可以使用this關鍵字用作構造函數(shù)初始化器,這個關鍵字指定在調(diào)用指定的構造函數(shù)前,實例化過程對當前類使用非默認的構造函數(shù)。例如:

 public MyDerivedClass():this(5,6)
  {
   Console.WriteLine("I am MyDerivedCalss()");
  }

使用MyDerivedCalss()構造函數(shù)實例化,執(zhí)行順序是:

1.執(zhí)行System.Object.Object()構造函數(shù)

2.執(zhí)行MyBaseClass.MyBaseClass(int i)構造函數(shù)

3.執(zhí)行MyDerivedClass.MyDerivedClass(int i,int j)構造函數(shù)

4.執(zhí)行MyDerivedClass.MyDerivedClass()構造函數(shù)

總之呢,無論派生類上使用什么樣的構造函數(shù)(默認的or不是默認的),除非明確指定(如使用base關鍵字),否則就先調(diào)用用基類的默認構造函數(shù)。

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • C# StringBuilder和string

    C# StringBuilder和string

    這篇文章主要介紹了C# StringBuilder和string,文章圍繞StringBuilder和string的相關資料展開內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • C#中IList 與 List 的區(qū)別小結

    C#中IList 與 List 的區(qū)別小結

    IList 接口和 List 類是 C# 中用于集合操作的兩個重要的類型,本文主要介紹了C#中IList 與 List 的區(qū)別小結,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • C#實現(xiàn)掃描槍掃描二維碼并打印(實例代碼)

    C#實現(xiàn)掃描槍掃描二維碼并打印(實例代碼)

    這篇文章主要介紹了C#實現(xiàn)掃描槍掃描二維碼并打印,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • C#中調(diào)用DLL時未能加載文件或程序集錯誤的處理方法(詳解)

    C#中調(diào)用DLL時未能加載文件或程序集錯誤的處理方法(詳解)

    下面小編就為大家?guī)硪黄狢#中調(diào)用DLL時未能加載文件或程序集錯誤的處理方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Unity Shader模擬玻璃效果

    Unity Shader模擬玻璃效果

    這篇文章主要為大家詳細介紹了Unity Shader模擬玻璃效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C#實現(xiàn)簡單的窗口抖動

    C#實現(xiàn)簡單的窗口抖動

    這篇文章主要為大家詳細介紹了C#實現(xiàn)簡單的窗口抖動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C#簡單生成縮略圖的方法

    C#簡單生成縮略圖的方法

    這篇文章主要介紹了C#簡單生成縮略圖的方法,涉及C#操作圖片的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • WPF實現(xiàn)動畫效果(一)之基本概念

    WPF實現(xiàn)動畫效果(一)之基本概念

    這篇文章介紹了WPF實現(xiàn)動畫效果之基本概念,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 詳解c# 多態(tài)

    詳解c# 多態(tài)

    這篇文章主要介紹了c# 多態(tài)的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • C#實現(xiàn)拼圖游戲

    C#實現(xiàn)拼圖游戲

    這篇文章主要為大家詳細介紹了C#實現(xiàn)拼圖游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論

临沧市| 旅游| 扎鲁特旗| 依安县| 灵山县| 镇康县| 武胜县| 定西市| 临漳县| 富蕴县| 昌宁县| 娄底市| 盐津县| 石城县| 中超| 昭通市| 广州市| 南通市| 红桥区| 嘉黎县| 河南省| 罗城| 内丘县| 岳阳县| 呼伦贝尔市| 云梦县| 兴城市| 海丰县| 宁化县| 华宁县| 金湖县| 广宁县| 凤阳县| 广元市| 宝坻区| 万年县| 和平区| 沁阳市| 乡城县| 澎湖县| 汝城县|