C#關鍵字掃盲——base和this

base this

base
官方描述:關鍵字用於從派生類中訪問基類的成員:
調用基類上已被其他方法重寫的方法。
指定創建派生類實例時應調用的基類構造函數。
僅允許基類訪問在構造函數、實例方法或實例屬性訪問器中進行。

this
官方描述:指代類的當前實例,還可用作擴展方法的第一個參數的修飾符。


項目源碼地址:https://gitee.com/michel4liu/LearnCSharp.git
項目:LearnBaseAndThis
環境VS2017 .NET Core2.0


繼承調用方式

     class Father
    {
        public Father()
        {
            Console.WriteLine($"{nameof(Father)}.構造函數");
        }

        public Father(string name)
        {
            Console.WriteLine($"{nameof(Father)}.構造函數,Name={name}");
        }

        public virtual void DoSomething()
        {
            Console.WriteLine($"{nameof(Father)}.Work");
        }
    }

    class Son : Father //繼承Father
    {
        public Son() : this("蘿蔔")
        {
            Console.WriteLine($"{nameof(Son)}.構造函數");
        }

        public Son(string name)
        {
            Console.WriteLine($"{nameof(Son)}.構造函數,Name={name}");
        }

        public override void DoSomething()
        {
            Console.WriteLine($"{nameof(Son)}.Learn");
        }
    }

    class Daughter : Father  //繼承Father
    {
        public Daughter() : base("大蘿蔔")
        {
            Console.WriteLine($"{nameof(Son)}.構造函數");
        }

        public override void DoSomething()
        {
            Console.WriteLine($"{nameof(Daughter)}.Play");
        }
    }

//輸出內容
static void Main(string[] args)
        {
            Father f = new Father();
            f.DoSomething();

            Console.WriteLine("------------------------");

            Son s = new Son();
            s.DoSomething();

            Console.WriteLine("------------------------");

            Daughter d = new Daughter();
            d.DoSomething();

            Console.ReadKey();
        }

輸出如下內容:

Father.構造函數
Father.Work
------------------------
Father.構造函數
Son.構造函數,Name=蘿蔔
Son.構造函數
Son.Learn
------------------------
Father.構造函數,Name=大蘿蔔
Son.構造函數
Daughter.Play

Son類表述的是this用法,構造時默認先調用基類的默認構造方法,然後在看是否自己有指定的this構造方法
Daughter類表述的是base用法,構造時先看是否指定調用基類的某個構造方法,如無則調用默認構造


this 擴展方法

    public static class Extension
    {
        public static double ToDollar(this double i)
        {
            return ToDollar(i, 6);
        }

        public static double ToDollar(this double i, int j)
        {
            return i *= j;
        }
    }

    static void Main(string[] args)
    {
        double j = 2;
        Console.WriteLine(j.ToDollar(7).ToString());  //輸出 14
        Console.WriteLine(j.ToDollar().ToString());   //輸出 12

        Console.ReadKey();
   }

本示例把double類進行擴展ToDollar(轉換爲美元)方法,根據擴展需要制定參數。
擴展方法官方解釋:擴展方法使你能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。 對於用 C#、F# 和 Visual Basic 編寫的客戶端代碼,調用擴展方法與調用在類型中實際定義的方法沒有明顯區別。
LINQ查詢都是擴展方法,引用System.Linq 後你會發現 集合的查詢多出很多 where、count等查詢方法。


注意點

  1. 不可在靜態方法中使用base和this。
  2. this也經常用在當前類中用this.屬性或this.方法表明要調用當前的屬性和方法。
  3. 擴展方法最好集中放在一起方便管理維護。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章