C#的基礎瑣碎總結—–委託

來源:互聯網
上載者:User

1、委託:其實就是方法的多態,可以更確切的說是方法的指標

2委託是參考型別,這與類和介面相似。

3一個委託可以指向多個方法,方法的簽名相同,委託才能指向它

4介面只能一次可以指向一個執行個體,而委託可以指向多個方法;此刻調用一個委託可以調用多個方法,也即是委託鏈

5、使用委託的步驟:

步驟1:聲明委託 

        1定義委託:可訪問性 delegate 傳回型別 (參數列表);
        2定義方法:可訪問性 傳回型別 (參數列表)

       //以上兩點根據參數類型和傳回型別進行匹配,必須兩者相同才能委託指向方法,也即函數的簽名必須相同

   public delegate void Job();

注意:其實委託相當於一個類所以定義委託一定要定義在方法的外面。

步驟2:建立委託調用的方法

  //建立一個類,裡麵包含兩個方法

 class School

    {

        public void teacher()

        {

            Console.WriteLine("老師的工作是教學生學習!");

        }

        public void student()

        {

            Console.WriteLine("學生的工作是好好學習!");

        }

}

步驟3:調用委託進而調用指向的方法

      static void Main(string[] args)

        {

            School school = new School();

           Job j = new Job(school.teacher); //執行個體化委託的時候必須指明其建構函式的參數,該參數不是值,不是引用,而是要指向方法的方法名

           j += new Job(school.student); //繼續加入委託鏈,其實相當於加入到委託數組裡面,就像是一個方法數組,即數組裡面儲存了多個方法

          Console.WriteLine("此刻該委託鏈中有{0}個方法",j.GetInvocationList().Length);

          // j.GetInvocationList().Length調用委託的一個方法擷取委託數組的長度,也即獲得委託方法的個數。

          j();

          j -= new Job(school.student); //當然也可以從委託鏈中減去相應不想用的方法 

         Console.WriteLine("此刻該委託鏈中有{0}個方法", j.GetInvocationList().Length);

         j();

       }

5、委託的廣播

     使用+=委託中添加一個方法,使用- =使委託中減少一個方法,其實委託鏈就存在一個委託數組中,數組中存的是方法的引用。+=相當於添加一個委託的引用,-=相當於減少一個委託的引用。

     單路廣播:一個委託指向一個方法

     多路廣播:一個委託指向多個方法

      注意:對於單路廣播可以使用傳回值,而對於多路廣播,方法的傳回值可能就不知一個,所以一般不建議帶傳回值,若必須有那麼委託接收的是委託鏈最後的那個方法的傳回值。 

6、委託類的成員

      以下方法可以簡單的瞭解下,是用編程的方式實現委託的建立,添加委託的方法,減去等。

7、委託增強

1、匿名方法:字面上講沒有名字的方法,能省略參數列表,意味著可以將匿名方法轉換為帶有各種簽名的委託。可以把代碼塊傳遞作為委託的參數,而這個代碼塊還是相當於原來類裡面的一個方法。好處:通過匿名方法不必建立單獨的一個方法,建立類,減少了執行個體化委託所需要的代碼系統開銷。

如:使用匿名方法實現老師工作的方法。

 Job jobdelegate = delegate()

   {

      Console.WriteLine("老師的工作是教學生學習!"); };

      jobdelegate();//使用該委託

      僅僅使用一次的方法一般不要寫在類裡面,避免冗餘,再如來個數相加:

      public delegate int Add(int a, int b);//定義委託

      Add add = delegate(int m, int n)

            {

                return m + n;

            };

            int result=add(1,2);

            Console.WriteLine(result);

8、協變和逆變

協變和逆變都是與繼承有關係的

(1)協變:允許方法具有的派生傳回型別比委託中定義的多,比如說:

定義兩個類,男人繼承於人類:class people{}; class men:people{};

定義委託:public delegate  people  MethodPeople();

委託可以返回people,也可以返回men;即 MethodPeople  m1=delegate(){return man;};

可以這麼簡單的理解:委託類型是父類類型,而委託調用方法時方法傳回型別可以使子類類型,當然也可以是父類類型。

(2)逆變:允許方法具有衍生類別參數類型比委託類型中的更少

字面上就能理解是和逆變相反的,說白了就是委託定義的子類類型或者參數為子類類型,而返回的可以使父類類型,或者參數傳入的時父類類型。

個人理解:其實這就是方法傳回型別和方法參數的多態,僅做參考。

協變和逆變用的地方不是很多,簡單瞭解就行。 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.