C#基礎:泛型委託

markriver發表於2021-09-09

泛型委託是委託的一種特殊形式,感覺看上去比較怪異,其實在使用的時候跟委託差不多,不過泛型委託更具有型別通用性。

就拿C#裡最常見的委託EventHandler打比方。在.NET 2.0以前,也就是泛型出現以前,普通的事件處理函式都由EventHandler定義,如下:

view plaincopy to clipboardprint?

  1. public delegate void EventHandler(object sender, EventArgs e);  

EventHandler指代了這樣一類函式,這些函式沒有返回值,並且有兩個引數,第一個引數是object型別,而第二個引數是EventArgs型別。

而.NET 2.0及其以後的版本,由於泛型的引入,所以一些內建(Built-in)的類、介面、委託都有了各自的泛型版本。EventHandler也不例外,它有了自己的泛型版本:EventHandler,它的定義如下:

view plaincopy to clipboardprint?

  1. [Serializable]   

  2. public delegate void EventHandler(object sender, TEventArgs e) where TEventArgs: EventArgs;  

您應該可以發現,第二個引數的型別由EventArgs變成了TEventArgs,而TEventArgs具體是什麼,則由呼叫方決定。假設IntEventArgs和StringEventArgs都繼承於System.EventArgs,那麼:

  • EventHandler指代這樣一類函式:這些函式沒有返回值,有兩個引數,第一個引數是object型別,第二個引數是IntEventArgs型別

  • EventHandler指代這樣一類函式:這些函式沒有返回值,有兩個引數,第一個引數是object型別,第二個引數是StringEventArgs型別

其實EventHandler和EventHandler是兩個完全不同的委託,它們所指代的函式都分別有著不同的簽名形式。請參見下面的示例:

view plaincopy to clipboardprint?

  1. class IntEventArgs : System.EventArgs   

  2. {   

  3.     public int IntValue { getset; }   

  4.     public IntEventArgs() { }   

  5.     public IntEventArgs(int value)    

  6.     { this.IntValue = value; }   

  7. }   

  8.   

  9. class StringEventArgs : System.EventArgs   

  10. {   

  11.     public string StringValue { getset; }   

  12.     public StringEventArgs() { }   

  13.     public StringEventArgs(string value)    

  14.     { this.StringValue = value; }   

  15. }   

  16.   

  17. class Program   

  18. {   

  19.     static void PrintInt(object sender, IntEventArgs e)   

  20.     {   

  21.         Console.WriteLine(e.IntValue);   

  22.     }   

  23.   

  24.     static void PrintString(object sender, StringEventArgs e)   

  25.     {   

  26.         Console.WriteLine(e.StringValue);   

  27.     }   

  28.   

  29.     static void Main(string[] args)   

  30.     {   

  31.         EventHandler ihandler =    

  32.             new EventHandler(PrintInt);   

  33.         EventHandler shandler =    

  34.             new EventHandler(PrintString);   

  35.   

  36.         ihandler(nullnew IntEventArgs(100));   

  37.         shandler(nullnew StringEventArgs("Hello World"));   

  38.     }   

  39. }   

有關泛型的具體特性與其在物件導向思想中的應用,將在後續與泛型相關的文章中重點闡述。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/818/viewspace-2812156/,如需轉載,請註明出處,否則將追究法律責任。

相關文章