一、委托(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"); }
新聞熱點
疑難解答