1. 程式人生 > >委托與事件學習筆記

委托與事件學習筆記

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 }

委托與事件學習筆記