委托與事件學習筆記
阿新 • • 發佈:2019-01-11
img vat args return ret 學習 virt invoke 註冊
參考並抄襲這兩篇博客:
https://www.cnblogs.com/wudiwushen/archive/2010/04/21/1717378.html
http://www.cnblogs.com/landeanfen/p/4642848.html
1、委托
1 //1、定義委托 2 // 根據委托的使用方式可視情況更改返回類型和添加輸入參數 3 public delegete void EventHandler(); 4 //2、定義方法 5 // 這裏方法沒有返回值,如有返回值的話應修改委托的返回類型 6 public void Fun1() 7 { 8 Console.WriteLine("我是添加到委托裏的方法1"); 9 } 10 public void Fun2() 11 { 12 Console.WriteLine("我是添加到委托裏的方法2"); 13 } 14 15 //3、將方法添加進委托中 16 EventHandler eventHandler=new EventHandler(Fun1);//簡寫為EventHandler eventHandler=Fun1; 17 eventHandler+=Fun2; 18 //運行委托 19 eventHandler();
自定義委托有點麻煩,又看到C#裏面Func類型的委托可用於處理有參數有返回值的方法
1//無參數有返回值 2 private static object Test3() 3 { 4 Console.WriteLine("Func Test3, Parameter"); 5 return Guid.NewGuid().ToString(); 6 } 7 8 //有參數有返回值 9 private static object Test4(string strRes) 10 { 11 Console.WriteLine("Func Test4, Parameter and Return Value"); 12 return strRes;
13 } 14 static void Main(string[] args) 15 { 16 var oFunc1 = new Func<object>(Test3); 17 var ofuncRes1 = oFunc1.Invoke(); 18 var oFunc2 = new Func<string, object>(Test4); 19 var ofuncRes2 =oFunc2("a");
20 }
具體使用的話,看了大神的實際使用樣式,需要以後慢慢琢磨。
2、事件的使用
事件差不多就是特殊的委托。
事件重要事項:
觸發事件:調用(Invoke)事件的術語。當事件被觸發時,所有註冊到他的方法都會被依次調用。
發布者(Publish):讓事件被其他類或結構可見並使用的類或結構。
訂閱者(subscriber):把事件和發布者關聯註冊的類和結構
事件處理程序:註冊到時間的方法。
實例:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Publisher publisher = new Publisher(); 6 Console.Write("請輸入要發布的雜誌:"); 7 string name = Console.ReadLine(); 8 if(name=="男人裝") 9 { 10 publisher.Publish += MrGao.Receive; 11 publisher.issue("男人裝出版啦!"); 12 } 13 Console.ReadKey(); 14 } 15 }
//發布者類 16 public class Publisher 17 { 18 public delegate void EventHandler(object sender,PubEventArgs e); 19 public event EventHandler Publish; 20 21 protected virtual void OnPublish(PubEventArgs e) 22 { 23 if(Publish!=null) 24 { 25 this.Publish(this, e); 26 } 27 } 28 public void issue(string magazineName) 29 { 30 OnPublish(new PubEventArgs(magazineName)); 31 } 32 }
//訂閱者類
33 public class MrGao 34 { 35 public static void Receive(object sender,PubEventArgs e) 36 { 37 Console.WriteLine("訂閱者收到發布內容!發布內容為:{0}",e.magazineName); 38 } 39 } 40 41 public class PubEventArgs:EventArgs 42 { 43 public readonly string magazineName; 44 public PubEventArgs() 45 { 46 } 47 public PubEventArgs(string magazineName) 48 { 49 this.magazineName = magazineName; 50 } 51 }
委托與事件學習筆記