C#基礎 base與this關鍵字

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

this是指當前對象自己,而base則是在繼承類中訪問基類時用的,只有對繼承關係的類纔有意義說base。this

綜合來講: this至關於本身的指針;base至關於父類的指針。spa

 

1、base關鍵字

用於在派生類中實現對基類公有或者受保護成員的訪問,可是隻侷限在構造函數、實例方法和實例屬性訪問器中。
功能主要包括:設計

(1)調用基類上已被其餘方法重寫的方法。 
(2)指定建立派生類實例時應調用的基類構造函數。
base經常使用於,在派生類對象初始化時和基類進行通訊。 
base能夠訪問基類的公有成員和受保護成員,私有成員是不可訪問的。
在多層繼承中,base能夠指向的父類的方法有兩種狀況:一是有重載存在的狀況下,base將指向直接繼承的父類成員的方法;而沒有重載存在的狀況下,base能夠指向任何上級父類的公有或者受保護方法。 指針

 -->注意:base關鍵字不能在靜態方法中使用。對象

 

2、this關鍵字

用於引用類的當前實例,也包括繼承而來的方法,一般能夠隱藏this。
功能主要包括:繼承

(1)限定被類似的名稱隱藏的成員 
(2)將對象做爲參數傳遞到其餘方法 
(3)聲明索引器 
this指代類對象自己,用於訪問本類的全部常量、字段、屬性和方法成員,並且無論訪問元素是任何訪問級別。由於,this僅僅侷限於對象內部,對象外部是沒法看到的,這就是this的基本思想。索引

注意:靜態成員不是對象的一部分,所以不能在靜態方法中引用this。準確來講,this關鍵字不能在靜態方法的方法體(即大括號之間的部分)中使用、可是能夠在參數中使用(即C#的擴展方法)。擴展

爲何不能在方法體中使用?構造函數

答:this指的是類實例化的當前對象,靜態方法是經過類調用的,不須要實例化;既然不須要實例化,就沒有當前對象;既然沒有當前對象,因此不能使用this 關鍵字。

 

3、用法注意

一、base經常使用於,在派生類對象初始化時和基類進行通訊。
二、base能夠訪問基類的公有成員和受保護成員,私有成員是不可訪問的。
三、this指代類對象自己,用於訪問本類的全部常量、字段、屬性和方法成員,並且無論訪問元素是任何訪問級別。由於,this僅僅侷限於對象內部,對象外部是沒法看到的,這就是this的基本思想。另外,靜態成員不是對象的一部分,所以不能在靜態方法中引用this。
四、在多層繼承中,base能夠指向的父類的方法有兩種狀況:一是有重載存在的狀況下,base將指向直接繼承的父類成員的方法;而沒有重載存在的狀況下,base能夠指向任何上級父類的公有或者受保護方法,

 

4、通用規則

一、儘可能少用或者不用base和this。除了決議子類的名稱衝突和在一個構造函數中調用其餘的構造函數以外,base和this的使用容易引發沒必要要的結果。
二、在靜態成員中使用base和this都是不容許的。緣由是,base和this訪問的都是類的實例,也就是對象,而靜態成員只能由類來訪問,不能由對象來訪問。
三、base是爲了實現多態而設計的。
四、使用this或base關鍵字只能指定一個構造函數,也就是說不可同時將this和base做用在一個構造函數上。
五、簡單的來講,base用於在派生類中訪問重寫的基類成員;而this用於訪問本類的成員,固然也包括繼承而來公有和保護成員。
六、除了base,訪問基類成員的另一種方式是:顯示的類型轉換來實現。只是該方法不能爲靜態方法。

 

5、拓展:C# 實例化的正確順序

派生類靜態字段被實例化。派生類靜態構造函數被調用。派生類實例成員字段被實例化。基類靜態字段被實例化。基類靜態構造函數被調用。基類實例成員字段被實例化。基類構造函數被調用。派生類構造函數被調用。

相關文章
相關標籤/搜索