C#:委託(delegate)

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   os   io   資料   

一、委託(delegate):是型別安全的方法的引用。在定義委託的時候就確定了該委託所代表的方法的參數簽名和返回資料類型,因此委託是型別安全的,這一點是與指標完全不同的。

委託的使用方法與類基本相同,委託的使用分三步:1、委託聲明;2、委託執行個體化;3、委託調用。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; using System.Collections;namespace ConsoleApplication{    class Program    {        delegate string GetString();
        static void  Main(string[] args)        {             string str="HelloWorld";             GetString dlg=new GetString(str.ToString);             Console.WriteLine("str.ToString():".PadRight(20) + str.ToString());             Console.WriteLine("dlg:".PadRight(20) + dlg);             Console.WriteLine("dlg():".PadRight(20) + dlg());                   Console.ReadKey();        }    }}

 

關於委託需要注意以下幾點:

①方法綁定委託時用的是方法的名稱,也就是不能帶括弧的;

②調用委託必須帶括弧;

 

二、Action<T> and Func<T> Delegates

這是兩種特殊的泛型委派,Action<T> 是沒有傳回值的委託,可以最少包含0個參數,最多包含16個參數;Func<T> 是帶有傳回值的委託,其中最後一個型別參數就是傳回值的類型,可以最少包含0個參數和一個傳回值,最多包含16個參數和一個傳回值。

例如:Action<int,string>

        該委託所代表的方法具有兩個參數,且第一個參數類型是int類型,第二個參數類型是string類型,沒有傳回值。

        Func<int,string>

        該委託所代表的方法具有一個參數,且該參數的數實值型別是int類型,具有傳回值,且傳回值類型是string類型。

 

三、多路廣播委託(Multicast Delegates)

一個委託執行個體可以綁定單個方法,也可以綁定多個方法。綁定單個方法的委託稱為單路廣播委託(Singlecast Delegetes),綁定多個方法的委託稱為多路廣播委託(Multicast Delegates)。

委託支援+,-,+=,-=運算子,所以兩個委託可以直接進行加減運算產生新的多路廣播委託。+運算或者+=運算就是將新的方法綁定到委託,-運算或者-=就是將方法與委託解除綁定。多路廣播委託綁定的方法的執行順序與方法綁定到委託的順序相同,但是在執行過程中,如果某個方法拋出異常,那麼之後的方法將都不能被執行。如果你希望在委託綁定的方法執行過程中,即使出現異常,之後的方法也能順利執行,可以使用GetInvocationList()方法,順序執行方法,並且捕獲異常。例如下面這個例子:

        static void Main()        {            Action d1 = One;            d1 += Two;            Delegate[] delegates = d1.GetInvocationList();            foreach (Action d in delegates)            {                try                {                    d();                }                catch (Exception)                {                    Console.WriteLine("Exception caught");                }            }            Console.ReadKey();        }        static void One()        {            Console.WriteLine("One");            throw new Exception("Error in one");        }        static void Two()        {            Console.WriteLine("Two");        }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.