C#基礎:泛型委托


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

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

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

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

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

  1. [Serializable]   
  2. public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs: EventArgs;  

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

  • EventHandler<IntEventArgs>指代這樣一類函數:這些函數沒有返回值,有兩個參數,第一個參數是object類型,第二個參數是IntEventArgs類型
  • EventHandler<StringEventArgs>指代這樣一類函數:這些函數沒有返回值,有兩個參數,第一個參數是object類型,第二個參數是StringEventArgs類型

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

  1. class IntEventArgs : System.EventArgs   
  2. {   
  3.     public int IntValue { get; set; }   
  4.     public IntEventArgs() { }   
  5.     public IntEventArgs(int value)    
  6.     { this.IntValue = value; }   
  7. }   
  8.   
  9. class StringEventArgs : System.EventArgs   
  10. {   
  11.     public string StringValue { get; set; }   
  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<IntEventArgs> ihandler =    
  32.             new EventHandler<IntEventArgs>(PrintInt);   
  33.         EventHandler<StringEventArgs> shandler =    
  34.             new EventHandler<StringEventArgs>(PrintString);   
  35.   
  36.         ihandler(null, new IntEventArgs(100));   
  37.         shandler(null, new StringEventArgs("Hello World"));   
  38.     }   
  39. }   

有關泛型的具體特性與其在面向對象思想中的應用,將在后續與泛型相關的文章中重點闡述。

 

原文地址:http://www.cnblogs.com/daxnet/archive/2008/11/11/1687012.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM