国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - C# - C#類(lèi)繼承中構(gòu)造函數(shù)的執(zhí)行序列示例詳解

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

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

這篇文章主要給大家介紹了關(guān)于C#類(lèi)繼承中構(gòu)造函數(shù)的執(zhí)行序列的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

1、派生類(lèi)自動(dòng)包含基類(lèi)的所有成員。但對(duì)于基類(lèi)的私有成員,派生類(lèi)雖然繼承了,但是不能在派生類(lèi)中訪問(wèn)。

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

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

為了實(shí)例化派生的類(lèi),必須先實(shí)例化它的基類(lèi)。而要實(shí)例化這個(gè)基類(lèi)。又必須要實(shí)例化這個(gè)基類(lèi)的基類(lèi),這樣一直到實(shí)例化system.object(所有類(lèi)的跟)為止,結(jié)果無(wú)論使用什么構(gòu)造函數(shù)實(shí)例化一個(gè)類(lèi),總是首先調(diào)用system.object.object() .

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

基類(lèi):

?
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)");
  }           
 }

派生類(lè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)");
  }

接下來(lái)我們?cè)趍ain函數(shù)中以不帶參數(shù)的構(gòu)造函數(shù)實(shí)例化myderivedclass:

?
1
myderivedclass myobj = new myderivedclass();

運(yùn)行程序,控制臺(tái)輸出如下:

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

從結(jié)果可以看出,執(zhí)行順序先是基類(lèi)構(gòu)造的函數(shù),接下來(lái)才是派生類(lèi)的構(gòu)造函數(shù),即

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

2.執(zhí)行mybaseclass.mybaseclass()構(gòu)造函數(shù)

3.執(zhí)行myderivedclass.myderivedclass()構(gòu)造函數(shù)

如果我們以帶一個(gè)參數(shù)的構(gòu)造函數(shù)實(shí)例化myderivedclass:

?
1
myderivedclass myobj = new myderivedclass(4);

運(yùn)行程序,控制臺(tái)輸出如下:

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

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

1.執(zhí)行system.object.object()構(gòu)造函數(shù)

2.執(zhí)行mybaseclass.mybaseclass()構(gòu)造函數(shù)

3.執(zhí)行myderivedclass.myderivedclass(int i)構(gòu)造函數(shù)

同理如果我們以帶兩個(gè)參數(shù)的構(gòu)造函數(shù)實(shí)例化myderivedclass

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

運(yùn)行程序,控制臺(tái)輸出如下:

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

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

1.執(zhí)行system.object.object()構(gòu)造函數(shù)

2.執(zhí)行mybaseclass.mybaseclass()構(gòu)造函數(shù)

3.執(zhí)行myderivedclass.myderivedclass(int i,int j)構(gòu)造函數(shù)

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

1.執(zhí)行system.object.object()構(gòu)造函數(shù)

2.執(zhí)行mybaseclass.mybaseclass(int i)構(gòu)造函數(shù)

3.執(zhí)行myderivedclass.myderivedclass(int i,int j)構(gòu)造函數(shù)

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

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

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

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

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

除了base關(guān)鍵字,還可以使用this關(guān)鍵字用作構(gòu)造函數(shù)初始化器,這個(gè)關(guān)鍵字指定在調(diào)用指定的構(gòu)造函數(shù)前,實(shí)例化過(guò)程對(duì)當(dāng)前類(lèi)使用非默認(rèn)的構(gòu)造函數(shù)。例如:

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

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

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

1.執(zhí)行system.object.object()構(gòu)造函數(shù)

2.執(zhí)行mybaseclass.mybaseclass(int i)構(gòu)造函數(shù)

3.執(zhí)行myderivedclass.myderivedclass(int i,int j)構(gòu)造函數(shù)

4.執(zhí)行myderivedclass.myderivedclass()構(gòu)造函數(shù)

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产午夜视频在线观看 | 久草 在线 | 欧美日本免费一区二区三区 | 久久久精品网站 | 日韩二区 | 久久国产精品久久久久久电车 | 成人av免费观看 | 天天干天天操 | 一级做a爰片性色毛片2021 | 国产激情91久久精品导航 | 欧美日韩国产在线播放 | 天天看夜夜爽 | 高清av网站 | 黄免费 | 亚洲免费在线 | 久久国产精品免费一区二区三区 | 一区二区中文字幕 | 亚洲狠狠爱一区二区三区 | 一级欧美一级日韩 | 免费视频久久久 | 国产精品高清一区二区 | 中文字幕天堂 | 欧美午夜一区二区 | 91精品国产91久久综合桃花 | 中文字幕免费播放 | 精品久久久久久久久久久久久久 | 精品在线一区二区 | 欧美日韩在线一区二区 | 美女久久 | 美女视频黄色片 | 免费看黄在线网站 | 99久久99久久精品 | 亚洲蜜桃精久久久久久久 | 黄色免费观看 | 亚洲网色 | 一级在线看 | 欧美精品偷拍 | 成人高清网站 | 天天操天天射天天 | 成人免费乱码大片a毛片软件 | 精品久久久久久久人人人人传媒 |