---
# System prepended metadata

title: this 與 base
tags: [C#]

---

###### tags: `C#`

# this 與 base
## this
* 透過 this 關鍵字可以直接存取所屬物件的屬性與方法，常用於 method 的參數名稱與屬性名稱重複的時候。base 關鍵字也是類似原理，只是 base 存取的對象是基底類別 (base class)

```csharp=
class Fruits
{
    private string type = "香蕉";        //私有變數與方法參數名稱相同
    
    public void GetFruit(string type)
    {
        Console.WriteLine(type);        //顯示：芭樂
        Console.WriteLine(this.type);   //顯示：香蕉
    }
}
class Program
{
    static void Main(string[] args)
    {
        Fruits fruits = new Fruits();
        fruits.GetFruit("芭樂");
    }
}
```
## base
* 當衍生類別中出現了名稱相同的屬性，若想存取基底類別中的屬性而非衍生類別的屬性，就可以使用 base 來存取
```csharp=
class Fruits
{
    protected string type = "水果";    
}
class Apple : Fruits
{
    private string type = "蘋果";
    
    public Apple()
    {
        //用 base 存取基底類別變數
        Console.WriteLine(base.type);    //顯示：水果
        Console.WriteLine(type);         //顯示：蘋果        
    }
}
class Program
{
    static void Main(string[] args)
    {
        Apple apple = new Apple();
    }
}
```
* 當衍生類別 override 了一個基底類別的 method，若想存取原版 (原本在基底類別內的版本) 的 method，就可以用 base
```csharp=
class Fruits
{
    private string type = "水果";
    
    public virtual void GetFruit()
    {
        Console.WriteLine("基底類別:" + type);
    }
}
class Apple : Fruits
{
    private string type = "蘋果";
    
    public override void GetFruit()
    {
        //用 base 存取基底類別方法
        base.GetFruit();                         //顯示：基底類別:水果
        Console.WriteLine("衍生類別:" + type);    //顯示：衍生類別:蘋果
    }
}
class Program
{
    static void Main(string[] args)
    {
        Apple apple = new Apple();
        apple.GetFruit();
    }
}
```
* 想要呼叫基底類別的建構子 (constructor) 時，可以在自己的建構子後加上 base 來呼叫
```csharp=
class Fruits
{ 
    public Fruits(string type)
    {       
        Console.WriteLine("基底類別:" + type);
    }
}
class Apple : Fruits
{
    private string type = "蘋果";
    //用 base 存取基底類別建構子
    public Apple(string type) : base(type)
    {
       Console.WriteLine("衍生類別:" + this.type);    //顯示：衍生類別:蘋果
    }
}
class Program
{
    static void Main(string[] args)
    {
        Apple apple = new Apple("水果");    //顯示：基底類別:水果
    }
}
```
> 參考資料
* [小山的 C# 教學-Base 關鍵字](https://www.youtube.com/watch?v=1eAGN-NPBXE)
* [C# base 和 this 的區別](https://www.796t.com/content/1544002264.html)
* [C# this 和 base](http://notepad.yehyeh.net/Content/CSharp/CH01/03ObjectOrient/5thisAndBase/index.php)
