C# 中的 base和this

     某天看代碼的時候,突然發現了這樣的一句話:

 

  完全不知道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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章