委托是多播委托,我們可以通過"+="把多個方法賦給委托變量,這樣就形成了一個委托鏈。本篇的話題包括:委托鏈是怎樣形成的,如何調用委托鏈方法,以及委托鏈異常處理。
□ 調用返回類型為void的委托所形成的委托鏈方法□ 調用返回類型不是void的委托所形成的委托鏈方法□ 調用返回類型不是void的泛型委托所形成的委托鏈方法□ 調用Func<T>泛型委托所形成的委托鏈方法□ 調用Action<T>泛型委托所形成的委托鏈方法□ 處理委托鏈異常
調用返回類型為void的委托所形成的委托鏈方法
來看下面的例子:
namespace Consoleapplication3{internal delegate void MySayDel(string msg);class PRogram{static void Main(string[] args){MySayDel del = SayHello;del = (MySayDel)Delegate.Combine(del, new MySayDel(SayNice)); //等同于:del += SayNice;del += SayOk;del("darren");}static void SayHello(string msg){Console.WriteLine("hello " + msg);}static void SayNice(string msg){Console.WriteLine("nice " + msg);}static void SayOk(string msg){Console.WriteLine("ok " + msg);}}}
最后,調用委托執行方法,最先注冊的方法最先執行。"+="是一種"語法糖",內部其實調用了Delegate的靜態方法Combine,形成委托鏈,再把委托鏈賦給委托變量。大致如下:
→當執行MySayDel del = SayHello;→當執行del = (MySayDel)Delegate.Combine(del, new MySayDel(SayNice)),在托管堆上又創建MySayDel委托實例指向SayNice方法,接著復制原先的、指向SayHello方法的委托實例,2個委托實例形成委托鏈,即藍色區域部分,棧上的委托變量del指向委托鏈。
調用返回類型不是void的委托所形成的委托鏈方法
以上,委托的返回類型是void,當調用委托的時候,依次執行委托鏈的方法。可是,如果委托的返回類型不是void,會不會依次執行委托鏈的方法呢?
新聞熱點
疑難解答