<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [你必須知道的.NET] 第六回:深入淺出關鍵字---base和this

      發布日期:2007.5.4 作者:Anytao

      ?2007 Anytao.com ,原創作品,轉貼請注明作者和出處。

       

      本文將介紹以下內容:

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

       

      1. 引言

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

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

      2. 基本概念

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

      2.1 base關鍵字

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

      • 調用基類上已被其他方法重寫的方法。
      • 指定創建派生類實例時應調用的基類構造函數。 

      2.2 this關鍵字

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

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

      3. 深入淺出

      3.1 示例為上

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

      base和this示例

      3.2 示例說明

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

      1. base常用于,在派生類對象初始化時和基類進行通信。
      2. base可以訪問基類的公有成員和受保護成員,私有成員是不可訪問的。
      3. this指代類對象本身,用于訪問本類的所有常量、字段、屬性和方法成員,而且不管訪問元素是任何訪問級別。因為,this僅僅局限于對象內部,對象外部是無法看到的,這就是this的基本思想。另外,靜態成員不是對象的一部分,因此不能在靜態方法中引用this。
      4. 在多層繼承中,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調用父類成員,因為沒有實現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訪問,則應該是直接父類實例呢,還是最高層類實例呢?

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

      1. 執行System.Object.Object();
      2. 執行Vehicle.Vehicle(string name, int speed);
      3. 執行Car.Car();
      4. 執行Car.Car(string name, int speed);
      5. 執行Audi.Audi();
      6. 執行Audi.Audi(string name, int speed)。

      我們在充分了解其實例化順序的基礎上就可以順利的把握base和this在作用于構造函數時的執行情況,并進一步了解其基本功能細節。

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

      Main方法的執行情況為:

      IL分析base和this執行

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

       4. 通用規則

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

      5. 結論

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

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

       

      參考文獻

      (USA)Stanley B.Lippman, C# Primer

      (USA)David Chappell, Understanding .NET

      (Cnblog)Bear-Study-Hard,C#學習筆記(二):構造函數的執行序列

      廣而告之

      [預告]

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

      [聲明] 

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

      溫故知新

      [開篇有益]

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

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

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

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

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

      ?2007 Anytao.com

      原創作品,轉貼請注明作者和出處,留此信息。

      本貼子以現狀提供且沒有任何擔保,同時也沒有授予任何權利。
      This posting is provided "AS IS" with no warranties, and confers no rights.

       

      posted @ 2007-05-04 00:31  Anytao  閱讀(19136)  評論(63)    收藏  舉報
      主站蜘蛛池模板: 国产一区二区三区自拍视频| 中文国产成人精品久久一| 国产又黄又硬又粗| 熟女人妻aⅴ一区二区三区电影| 婷婷久久综合九色综合88| 日韩有码中文字幕第一页| 精品国产一区av天美传媒| 日本高清视频网站www| 亚洲熟妇自偷自拍另欧美| 国产清纯在线一区二区| 久久亚洲精品国产精品| 光棍天堂在线手机播放免费| 亚洲日产韩国一二三四区| 妺妺窝人体色www看美女| 粉嫩av国产一区二区三区| 中文字幕无线码免费人妻| 华人在线亚洲欧美精品| 国产精品爆乳奶水无码视频免费 | 真实国产熟睡乱子伦视频| 丰满的少妇一区二区三区| 日韩精品一区二区三区中文无码| 亚洲欧美色综合影院| 久久久精品波多野结衣av | 国产乱色熟女一二三四区| 尤物yw193无码点击进入| 国产精品伊人久久综合网| 丝袜高潮流白浆潮喷在线播放| 国产亚洲色视频在线| 国产成人AV男人的天堂| 亚洲国产成人无码av在线影院| 香港日本三级亚洲三级| 国产乱人伦无无码视频试看 | 碌曲县| 亚洲综合一区二区三区视频| 国产精品v片在线观看不卡| 免费AV片在线观看网址| 国产精品高清视亚洲乱码| 久久亚洲精品日本波多野结衣| 国产播放91色在线观看| 久久久久无码国产精品不卡| 无码人妻丝袜在线视频|