一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - C#類繼承中構造函數的執行序列示例詳解

C#類繼承中構造函數的執行序列示例詳解

2022-02-28 14:28yixuan.han C#

這篇文章主要給大家介紹了關于C#類繼承中構造函數的執行序列的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

大家都知道類的繼承規則:

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

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

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

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

下面一個示例演示執行順序:

基類:

?
1
2
3
4
5
6
7
8
9
10
11
public class mybaseclass
 {
  public mybaseclass()
  {
   console.writeline("i am mybaseclass()");
  }
  public mybaseclass(int i)
  {
   console.writeline("i am mybaseclass(int i)");
  }           
 }

派生類:

?
1
2
3
4
5
6
7
8
9
10
11
12
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函數中以不帶參數的構造函數實例化myderivedclass:

?
1
myderivedclass myobj = new myderivedclass();

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

C#類繼承中構造函數的執行序列示例詳解

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

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

2.執行mybaseclass.mybaseclass()構造函數

3.執行myderivedclass.myderivedclass()構造函數

如果我們以帶一個參數的構造函數實例化myderivedclass:

?
1
myderivedclass myobj = new myderivedclass(4);

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

C#類繼承中構造函數的執行序列示例詳解

可以看出執行順序如下:

1.執行system.object.object()構造函數

2.執行mybaseclass.mybaseclass()構造函數

3.執行myderivedclass.myderivedclass(int i)構造函數

同理如果我們以帶兩個參數的構造函數實例化myderivedclass

?
1
myderivedclass myobj = new myderivedclass(4,8);

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

C#類繼承中構造函數的執行序列示例詳解

可以看出執行順序如下:

1.執行system.object.object()構造函數

2.執行mybaseclass.mybaseclass()構造函數

3.執行myderivedclass.myderivedclass(int i,int j)構造函數

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

1.執行system.object.object()構造函數

2.執行mybaseclass.mybaseclass(int i)構造函數

3.執行myderivedclass.myderivedclass(int i,int j)構造函數

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

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

?
1
2
3
4
public myderivedclass(int i,int j) : base(i)
 {
  console.writeline("i am myderivedclass(int i,int j)");
 }

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

C#類繼承中構造函數的執行序列示例詳解

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

?
1
2
3
4
public myderivedclass():this(5,6)
 {
  console.writeline("i am myderivedcalss()");
 }

使用myderivedcalss()構造函數實例化,執行順序是:

C#類繼承中構造函數的執行序列示例詳解

1.執行system.object.object()構造函數

2.執行mybaseclass.mybaseclass(int i)構造函數

3.執行myderivedclass.myderivedclass(int i,int j)構造函數

4.執行myderivedclass.myderivedclass()構造函數

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

總結

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

原文鏈接:https://www.cnblogs.com/yixuanhan/p/9596454.html

延伸 · 閱讀

精彩推薦
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
主站蜘蛛池模板: 色人阁导航 | 亚洲AV无码一区二区三区乱子伦 | 美女18隐私羞羞视频网站 | 天天射夜夜爽 | 国产裸露片段精华合集链接 | 成人精品视频 成人影院 | 国产精品猎奇系列在线观看 | 青草国产在线观看 | 五月一区二区久久综合天堂 | japan孕妇孕交| 2021最新国产成人精品免费 | 欧美3d怪物交videos网站 | 成年性香蕉漫画在线观看 | 日本无翼乌漫画 | 婷婷丁香色综合狠狠色 | 日本三级免费网站 | 门房秦大爷最新章节阅读 | 亚洲欧美日韩精品 | 97porm国内自拍视频 | 久久国产加勒比精品无码 | 午夜国产精品福利在线观看 | 女人被爽到呻吟娇喘的视频动态图 | 红楼梦黄色小说 | 天天天天天天天操 | 欧美一区二区不卡视频 | 国产美女屁股直流白浆视频无遮挡 | 五月天狠狠 | 亚洲第一se情网站 | www.天天操| 国产精品免费久久久久影院 | 色综合网天天综合色中文男男 | 亚洲国产一区二区三区青草影视 | 肉宠文很肉到处做1v1 | 变态 另类 人妖小说 | 日韩 欧美 国产 亚洲 中文 | 北岛玲亚洲一区在线观看 | 久久亚洲精品AV成人无码 | 欧美高清milf在线播放 | 给我免费的视频在线观看 | 黑人异族日本人hd | 免费在线观看日本 |