某天看代碼的時候,突然發現了這樣的一句話:
完全不知道this在這裏的作用和意義。藉此,一起捋一下 this和base的使用和區別。
首先,base和this 在C#中都被定義爲訪問關鍵字:
base(C# 參考)
訪問基類的成員。
base
關鍵字用於從派生類中訪問基類的成員:
-
調用基類上已被其他方法重寫的方法。
-
指定創建派生類實例時應調用的基類構造函數。
僅允許基類訪問在構造函數、實例方法或實例屬性訪問器中進行。
從靜態方法中使用 base
關鍵字是錯誤的。
所訪問的基類是類聲明中指定的基類。 例如,如果指定 class ClassB : ClassA
,則從 ClassB 訪問 ClassA 的成員,而不考慮 ClassA 的基類。
Q:根據上面的描述,我們在此提一個問題:在多層繼承的情況下,生成最外層的實例的時候,實例化過程應該是怎麼樣的順序呢?
this(C# 參考)
引用類的當前實例。
this
關鍵字指代類的當前實例,還可用作擴展方法的第一個參數的修飾符。
以下是 this
的常見用法:(此處不包含this的擴展方法!)
-
限定類似名稱隱藏的成員,例如:
public class Employee { private string alias; private string name; public Employee(string name, string alias) { this.name = name; this.alias = alias; } }
-
將對象作爲參數傳遞給方法,例如:
CalcTax(this);
-
聲明索引器,例如:
public int this[int param] { get { return array[param]; } set { array[param] = value; } }
-
注:
靜態成員函數,因爲它們存在於類級別且不屬於對象,不具有this
指針。 在靜態方法中引用this
會生成錯誤。
總結
1.this 用於當前類內,base用於派生類中
2.實例化過程首先要先實例化其基類,並且依此類推,一直到實例化System.Object爲止。例如:
//第一級 public class One { public One() { Console.WriteLine("這是第一級"); } public One(string name) { Console.WriteLine($"這是第一級,帶有name參數的構造函數{name}"); } public virtual void Show() { Console.WriteLine("這是第一級的show方法"); } } //第二級 public class Two : One { public Two() { Console.WriteLine("這是第二級"); } public Two(string name):this() { Console.WriteLine($"這是第二級的帶有name參數的構造函數{name}"); } public override void Show() { Console.WriteLine("這是第二級的show方法"); } } //第三級 public class Three : Two { public Three() { Console.WriteLine("這是第三級"); } public Three(string name) : base(name) { Console.WriteLine($"這是第三級的帶有name參數的構造函數:{name}"); } public override void Show() { base.Show(); Console.WriteLine("這是第三級的show方法"); } }
//調用測試 class Program { static void Main(string[] args) { var test = new Three("測試"); Console.ReadKey(); } }
執行結果:
可以複製以上代碼,自己運行一下看看,基本就都瞭解了。
以上,over.