日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

[你必须知道的.NET] 第六回:深入浅出关键字---base和this

發(fā)布時間:2023/12/10 asp.net 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [你必须知道的.NET] 第六回:深入浅出关键字---base和this 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文將介紹以下內容:

  • 面向對象基本概念
  • base關鍵字深入淺出
  • this關鍵字深入淺出

?

1.?引言

new關鍵字引起了大家的不少關注,尤其感謝Anders Liu的補充,讓我感覺博客園賦予的交流平臺真的無所不在。所以,我們就有必要繼續(xù)這個話題,把我認為最值得關注的關鍵字開展下去,本文的重點是訪問關鍵字(Access Keywords):base和this。雖然訪問關鍵字不是很難理解的話題,我們還是有可以深入討論的地方來理清思路。還是老辦法,我的問題先列出來,您是否做好了準備。

  • 是否可以在靜態(tài)方法中使用base和this,為什么?
  • base常用于哪些方面?this常用于哪些方面?
  • 可以base訪問基類的一切成員嗎?
  • 如果有三層或者更多繼承,那么最下級派生類的base指向那一層呢?例如.NET體系中,如果以base訪問,則應該是直接父類實例呢,還是最高層類實例呢?
  • 以base和this應用于構造函數(shù)時,繼承類對象實例化的執(zhí)行順序如何??
  • 2. 基本概念

    base和this在C#中被歸于訪問關鍵字,顧名思義,就是用于實現(xiàn)繼承機制的訪問操作,來滿足對對象成員的訪問,從而為多態(tài)機制提供更加靈活的處理方式。?

    2.1 base關鍵字

    其用于在派生類中實現(xiàn)對基類公有或者受保護成員的訪問,但是只局限在構造函數(shù)、實例方法和實例屬性訪問器中,MSDN中小結的具體功能包括:

    • 調用基類上已被其他方法重寫的方法。
    • 指定創(chuàng)建派生類實例時應調用的基類構造函數(shù)。?

    2.2 this關鍵字

    其用于引用類的當前實例,也包括繼承而來的方法,通常可以隱藏this,MSDN中的小結功能主要包括:

    • 限定被相似的名稱隱藏的成員
    • 將對象作為參數(shù)傳遞到其他方法
    • 聲明索引器?

    3. 深入淺出

    3.1?示例為上

    下面以一個小示例來綜合的說明,base和this在訪問操作中的應用,從而對其有個概要了解,更詳細的規(guī)則和深入我們接著闡述。本示例沒有完全的設計概念,主要用來闡述base和this關鍵字的使用要點和難點闡述,具體的如下:?

    base和this示例

    3.2 示例說明

    上面的示例基本包括了base和this使用的所有基本功能演示,具體的說明可以從注釋中得到解釋,下面的說明是對注釋的進一步闡述和補充,來說明在應用方面的幾個要點:

  • base常用于,在派生類對象初始化時和基類進行通信。
  • base可以訪問基類的公有成員和受保護成員,私有成員是不可訪問的。
  • this指代類對象本身,用于訪問本類的所有常量、字段、屬性和方法成員,而且不管訪問元素是任何訪問級別。因為,this僅僅局限于對象內部,對象外部是無法看到的,這就是this的基本思想。另外,靜態(tài)成員不是對象的一部分,因此不能在靜態(tài)方法中引用this。
  • 在多層繼承中,base可以指向的父類的方法有兩種情況:一是有重載存在的情況下,base將指向直接繼承的父類成員的方法,例如Audi類中的ShowResult方法中,使用base訪問的將是Car.ShowResult()方法,而不能訪問Vehicle.ShowResult()方法;而是沒有重載存在的情況下,base可以指向任何上級父類的公有或者受保護方法,例如Audi類中,可以使用base訪問基類Vehicle.Run()方法。這些我們可以使用ILDasm.exe,從IL代碼中得到答案。?
  • .method?public?hidebysig?virtual?instance?void?
    ????????ShowResult()?cil?managed
    {
    ??
    //?代碼大小???????27?(0x1b)
    ??.maxstack??8
    ??IL_0000:??nop
    ??IL_0001:??ldarg.
    0
    ??//base調用父類成員
    ??IL_0002:??call???????instance?void?Anytao.net.My_Must_net.Car::ShowResult()
    ??IL_0007:??nop
    ??IL_0008:??ldarg.
    0
    ??//base調用父類成員,因為沒有實現(xiàn)Car.Run(),所以指向更高級父類
    ??IL_0009:??call???????instance?void?Anytao.net.My_Must_net.Vehicle::Run()
    ??IL_000e:??nop
    ??IL_000f:??ldstr??????
    "It's?audi's?result."
    ??IL_0014:??call???????void?[mscorlib]System.Console::WriteLine(string)
    ??IL_0019:??nop
    ??IL_001a:??ret
    }?
    //?end?of?method?Audi::ShowResult

    3.3 深入剖析?

    如果有三次或者更多繼承,那么最下級派生類的base指向那一層呢?例如.NET體系中,如果以base訪問,則應該是直接父類實例呢,還是最高層類實例呢?

    首先我們有必要了解類創(chuàng)建過程中的實例化順序,才能進一步了解base機制的詳細執(zhí)行過程。一般來說,實例化過程首先要先實例化其基類,并且依此類推,一直到實例化System.Object為止。因此,類實例化,總是從調用System.Object.Object()開始。因此示例中的類Audi的實例化過程大概可以小結為以下順序執(zhí)行,詳細可以參考示例代碼分析。

  • 執(zhí)行System.Object.Object();
  • 執(zhí)行Vehicle.Vehicle(string name, int speed);
  • 執(zhí)行Car.Car();
  • 執(zhí)行Car.Car(string name, int speed);
  • 執(zhí)行Audi.Audi();
  • 執(zhí)行Audi.Audi(string name, int speed)。
  • 我們在充分了解其實例化順序的基礎上就可以順利的把握base和this在作用于構造函數(shù)時的執(zhí)行情況,并進一步了解其基本功能細節(jié)。

    下面更重要的分析則是,以ILDASM.exe工具為基礎來分析IL反編譯代碼,以便更深層次的了解執(zhí)行在base和this背后的應用實質,只有這樣我們才能說對技術有了基本的剖析。

    Main方法的執(zhí)行情況為:

    IL分析base和this執(zhí)行

    ?因此,對重寫父類方法,最終指向了最高級父類的方法成員。

    ?4. 通用規(guī)則

    • 盡量少用或者不用base和this。除了決議子類的名稱沖突和在一個構造函數(shù)中調用其他的構造函數(shù)之外,base和this的使用容易引起不必要的結果。
    • 在靜態(tài)成員中使用base和this都是不允許的。原因是,base和this訪問的都是類的實例,也就是對象,而靜態(tài)成員只能由類來訪問,不能由對象來訪問。
    • base是為了實現(xiàn)多態(tài)而設計的。
    • 使用this或base關鍵字只能指定一個構造函數(shù),也就是說不可同時將this和base作用在一個構造函數(shù)上。
    • 簡單的來說,base用于在派生類中訪問重寫的基類成員;而this用于訪問本類的成員,當然也包括繼承而來公有和保護成員。
    • 除了base,訪問基類成員的另外一種方式是:顯示的類型轉換來實現(xiàn)。只是該方法不能為靜態(tài)方法。

    5. 結論

    base和this關鍵字,不是特別難于理解的內容,本文之所以將其作為系列的主題,除了對其應用規(guī)則做以小結之外,更重要的是在關注其執(zhí)行細節(jié)的基礎上,對語言背景建立更清晰的把握和分析,這些才是學習和技術應用的根本所在,也是.NET技術框架中本質訴求。對學習者來說,只有從本質上來把握概念,才能在變化非凡的應用中,一眼找到答案。?

    言歸正傳,開篇的幾個題目,不知讀者是否有了各自的答案,我們不妨暢所欲言,做更深入的討論,以便揭開其真實的面紗。?

    ?

    參考文獻

    (USA)Stanley B.Lippman, C# Primer

    (USA)David Chappell, Understanding .NET

    (Cnblog)Bear-Study-HardC#學習筆記(二):構造函數(shù)的執(zhí)行序列

    廣而告之

    [預告]

    另外鑒于前幾個主題的討論中,不管是類型、關鍵字等都涉及到引用類型和值類型的話題,我將于近期發(fā)表相關內容的探討,主要包括3個方面的內容,這是本系列近期動向,給自己做個廣告。祝各位愉快。?

    [聲明]?

    本文的關鍵字指的是C#中的關鍵字概念,并非一般意義上的.NET CRL范疇,之所以將這個主題加入本系列,是基于在.NET體系下開發(fā)的我們,何言能逃得過基本語言的只是要點。所以大可不必追究什么是.NET,什么是C#的話題,希望大家理清概念,有的放肆。

    溫故知新

    [開篇有益]

    [第一回:恩怨情仇:is和as]

    [第二回:對抽象編程:接口和抽象類]

    [第三回:歷史糾葛:特性和屬性]

    [第四回:后來居上:class和struct]

    [第五回:深入淺出關鍵字---把new說透]

    總結

    以上是生活随笔為你收集整理的[你必须知道的.NET] 第六回:深入浅出关键字---base和this的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 一级日韩一级欧美 | 麻豆黄色网址 | 久热草 | 国产无遮挡a片又黄又爽 | 亚洲一区二区三区加勒比 | 久草福利资源在线观看 | 亚洲视频在线免费看 | 男人天堂亚洲天堂 | 男人影院在线观看 | 黄色成年人视频 | 欧美乱妇高清无乱码 | 中文字幕亚洲乱码熟女一区二区 | 中文天堂在线资源 | 午夜不卡av | 亚洲不卡中文字幕 | 99久免费精品视频在线观78 | 日本h漫在线观看 | 亚洲乱色熟女一区二区 | 岛国色图 | 欧美一级淫片免费视频黄 | 亚洲欧洲日韩综合 | 香蕉视频网页版 | 欧美成免费 | 日韩a√| 国内自拍区 | 国产一区二区视频免费观看 | 中国老太婆性视频 | 一级看片 | 麻豆黄色网址 | 狠狠干天天爱 | 色综合图片区 | 中文字幕观看视频 | 尤物影院在线观看 | 精品一区二区久久久久久按摩 | 五月激情丁香 | 91午夜精品 | 国产无套内射又大又猛又粗又爽 | 亚洲一区二区三区久久久成人动漫 | 中文字幕一区二区三区人妻电影 | 狠狠操狠狠插 | 九九免费在线视频 | 在线观看你懂的网址 | 欧美性生交大片免费看 | 国产麻豆乱码精品一区二区三区 | 成人app在线 | 久久精品国产熟女亚洲AV麻豆 | 天天射天天干 | 欧美成人一二三 | 91热久久| 亚洲 激情 | 日韩毛片一区二区三区 | 日本一区二区三区中文字幕 | 不卡av电影在线观看 | 国产做爰全免费的视频软件 | 欧美人与禽猛交乱配 | 国产三级三级看三级 | 看看毛片| 国产乱淫av片免费 | 在线成人免费观看 | 精品肉丝脚一区二区三区 | 大奶子网站 | 中文字幕电影av | 国产91影院| 欧美激情偷拍 | 色女生影院 | 少妇福利视频 | 国产宾馆实践打屁股91 | 182午夜视频 | 欧美性tv| 香蕉视频官网 | 亚洲另类xxxx | 18被视频免费观看视频 | 一区二区三区美女 | 韩国精品一区 | 超碰在线免费 | 91精品网 | 欧美少妇一区二区 | 国产日韩精品一区二区 | a级免费视频 | 亚洲av无码一区二区三区在线 | 18岁成年人网站 | 天海翼视频在线观看 | 色屁屁一区二区 | 特黄特色大片bbbb | 欧美一级淫片007 | 色九九 | www.四虎com| 懂色av蜜臀av粉嫩av分享吧 | 天天躁日日躁aaaaxxxx | 大尺度做爰呻吟舌吻网站 | 一本大道东京热无码 | 欧美成人免费在线视频 | av资源部 | 欧美综合第一页 | 哪个网站可以看毛片 | 91麻豆精品国产91久久久久久 | 一本色道久久综合熟妇 | 午夜美女福利视频 | 亚洲黄色片子 |