一個簡單的小例子讓你明白c#中的委托-終於懂了!


模擬主持人發布一個問題,由多個嘉賓來回答這個問題。

 

分析:從需求中抽出Host (主持人) 類和Guests (嘉賓) 類。

作為問題的發布者,Host不知道問題如何解答。因此它只能發布這個事件,將事件委托給多個嘉賓去處理。因此在Host 類定義事件,在Guests類中定義事件的響應方法。通過多番委托的"+="將響應方法添加到事件列表中,最終 Host 類將觸發這個事件。實現過程如下:

 

代碼其實很少下面貼出來所有代碼:

 

QuestionArgs.cs

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     public class QuestionArgs:EventArgs  
  9.     {  
  10.         public string Message { get; set; }  
  11.     }  
  12. }  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     public class QuestionArgs:EventArgs  
  9.     {  
  10.         public string Message { get; set; }  
  11.     }  
  12. }  

 

 

 

 

 

Program.cs

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     class Program  
  9.     {  
  10.         static void Main(string[] args)  
  11.         {  
  12.             Host host = new Host();  
  13.             host.Name = "主持人";  
  14.             host.args.Message = "C#的事件如何實現的?";  
  15.             Guests[] gArray = new Guests[3]  
  16.             {  
  17.                 new GuestA(){Name = "張小三"},  
  18.                 new GuestB(){Name = "李小四"},  
  19.                 new GuestC(){Name = "王老五"}  
  20.             };  
  21.             //用+=號,將嘉賓的答題方法加入到委托鏈  
  22.             host.QuestionEvent += new QuestionHandler(gArray[0].answer);  
  23.             host.QuestionEvent += new QuestionHandler(gArray[1].answer);  
  24.             host.QuestionEvent += new QuestionHandler(gArray[2].answer);  
  25.   
  26.             //觸發事件   
  27.             host.StartAnswer();  
  28.             Console.ReadLine();  
  29.         }  
  30.     }  
  31. }<span style="color:#ff0000;">  
  32. </span>  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     class Program  
  9.     {  
  10.         static void Main(string[] args)  
  11.         {  
  12.             Host host = new Host();  
  13.             host.Name = "主持人";  
  14.             host.args.Message = "C#的事件如何實現的?";  
  15.             Guests[] gArray = new Guests[3]  
  16.             {  
  17.                 new GuestA(){Name = "張小三"},  
  18.                 new GuestB(){Name = "李小四"},  
  19.                 new GuestC(){Name = "王老五"}  
  20.             };  
  21.             //用+=號,將嘉賓的答題方法加入到委托鏈  
  22.             host.QuestionEvent += new QuestionHandler(gArray[0].answer);  
  23.             host.QuestionEvent += new QuestionHandler(gArray[1].answer);  
  24.             host.QuestionEvent += new QuestionHandler(gArray[2].answer);  
  25.   
  26.             //觸發事件  
  27.             host.StartAnswer();  
  28.             Console.ReadLine();  
  29.         }  
  30.     }  
  31. }<span style="color:#ff0000;">  
  32. </span>  



 

 

 

 

Host.cs

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     public delegate void QuestionHandler(object sender,QuestionArgs e);  
  9.     public class Host  
  10.     {  
  11.         //定義一個事件   
  12.         public event QuestionHandler QuestionEvent;  
  13.         public QuestionArgs args { set; get; }  
  14.         public Host()  
  15.         {  
  16.             //初始化事件參數   
  17.             args = new QuestionArgs();  
  18.         }  
  19.         public string Name { get; set; }  
  20.         public void StartAnswer()  
  21.         {  
  22.             Console.WriteLine("開始答題");  
  23.             QuestionEvent(this, args);  
  24.         }  
  25.     }  
  26. }  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     public delegate void QuestionHandler(object sender,QuestionArgs e);  
  9.     public class Host  
  10.     {  
  11.         //定義一個事件  
  12.         public event QuestionHandler QuestionEvent;  
  13.         public QuestionArgs args { set; get; }  
  14.         public Host()  
  15.         {  
  16.             //初始化事件參數  
  17.             args = new QuestionArgs();  
  18.         }  
  19.         public string Name { get; set; }  
  20.         public void StartAnswer()  
  21.         {  
  22.             Console.WriteLine("開始答題");  
  23.             QuestionEvent(this, args);  
  24.         }  
  25.     }  
  26. }  



 

 

 

 

Guests.cs

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     /// <summary>   
  9.     /// 父類   
  10.     /// </summary>   
  11.     public class Guests  
  12.     {  
  13.         /// <summary>   
  14.         /// 嘉賓姓名   
  15.         /// </summary>   
  16.         public string Name { get; set; }  
  17.   
  18.         public virtual void answer(object sender, QuestionArgs e)  
  19.         {  
  20.             Console.Write("事件的發出者:" + (sender as Host).Name);  
  21.             Console.WriteLine("問題是:" + e.Message);  
  22.         }  
  23.     }  
  24. }  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     /// <summary>  
  9.     /// 父類  
  10.     /// </summary>  
  11.     public class Guests  
  12.     {  
  13.         /// <summary>  
  14.         /// 嘉賓姓名  
  15.         /// </summary>  
  16.         public string Name { get; set; }  
  17.   
  18.         public virtual void answer(object sender, QuestionArgs e)  
  19.         {  
  20.             Console.Write("事件的發出者:" + (sender as Host).Name);  
  21.             Console.WriteLine("問題是:" + e.Message);  
  22.         }  
  23.     }  
  24. }  



 

 

 

 

GuestC.cs

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     class GuestC:Guests  
  9.     {  
  10.         public override void answer(object sender, QuestionArgs e)  
  11.         {  
  12.             base.answer(sender, e);  
  13.             Console.WriteLine("{0}開始答題:我不知道", this.Name);  
  14.         }  
  15.     }  
  16. }  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     class GuestC:Guests  
  9.     {  
  10.         public override void answer(object sender, QuestionArgs e)  
  11.         {  
  12.             base.answer(sender, e);  
  13.             Console.WriteLine("{0}開始答題:我不知道", this.Name);  
  14.         }  
  15.     }  
  16. }  



 

 

 

 

GuestB.cs

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     class GuestB:Guests  
  9.     {  
  10.         public override void answer(object sender, QuestionArgs e)  
  11.         {  
  12.             base.answer(sender, e);  
  13.             Console.WriteLine("{0}開始答題:我不知道", this.Name);  
  14.         }  
  15.     }  
  16. }  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     class GuestB:Guests  
  9.     {  
  10.         public override void answer(object sender, QuestionArgs e)  
  11.         {  
  12.             base.answer(sender, e);  
  13.             Console.WriteLine("{0}開始答題:我不知道", this.Name);  
  14.         }  
  15.     }  
  16. }  



 

 

 

 

GuestA.cs

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     class GuestA:Guests  
  9.     {  
  10.         public override void answer(object sender, QuestionArgs e)  
  11.         {  
  12.             base.answer(sender, e);  
  13.             Console.WriteLine("{0}開始答題:我不知道", this.Name);  
  14.         }  
  15.     }  
  16. }  
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace EventDemo  
  7. {  
  8.     class GuestA:Guests  
  9.     {  
  10.         public override void answer(object sender, QuestionArgs e)  
  11.         {  
  12.             base.answer(sender, e);  
  13.             Console.WriteLine("{0}開始答題:我不知道", this.Name);  
  14.         }  
  15.     }  
  16. }  

 

 

運行結果:

 


免責聲明!

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



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