模擬主持人發布一個問題,由多個嘉賓來回答這個問題。
分析:從需求中抽出Host (主持人) 類和Guests (嘉賓) 類。
作為問題的發布者,Host不知道問題如何解答。因此它只能發布這個事件,將事件委托給多個嘉賓去處理。因此在Host 類定義事件,在Guests類中定義事件的響應方法。通過多番委托的"+="將響應方法添加到事件列表中,最終 Host 類將觸發這個事件。實現過程如下:

代碼其實很少下面貼出來所有代碼:
QuestionArgs.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- public class QuestionArgs:EventArgs
- {
- public string Message { get; set; }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- public class QuestionArgs:EventArgs
- {
- public string Message { get; set; }
- }
- }
Program.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- class Program
- {
- static void Main(string[] args)
- {
- Host host = new Host();
- host.Name = "主持人";
- host.args.Message = "C#的事件如何實現的?";
- Guests[] gArray = new Guests[3]
- {
- new GuestA(){Name = "張小三"},
- new GuestB(){Name = "李小四"},
- new GuestC(){Name = "王老五"}
- };
- //用+=號,將嘉賓的答題方法加入到委托鏈
- host.QuestionEvent += new QuestionHandler(gArray[0].answer);
- host.QuestionEvent += new QuestionHandler(gArray[1].answer);
- host.QuestionEvent += new QuestionHandler(gArray[2].answer);
- //觸發事件
- host.StartAnswer();
- Console.ReadLine();
- }
- }
- }<span style="color:#ff0000;">
- </span>
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- class Program
- {
- static void Main(string[] args)
- {
- Host host = new Host();
- host.Name = "主持人";
- host.args.Message = "C#的事件如何實現的?";
- Guests[] gArray = new Guests[3]
- {
- new GuestA(){Name = "張小三"},
- new GuestB(){Name = "李小四"},
- new GuestC(){Name = "王老五"}
- };
- //用+=號,將嘉賓的答題方法加入到委托鏈
- host.QuestionEvent += new QuestionHandler(gArray[0].answer);
- host.QuestionEvent += new QuestionHandler(gArray[1].answer);
- host.QuestionEvent += new QuestionHandler(gArray[2].answer);
- //觸發事件
- host.StartAnswer();
- Console.ReadLine();
- }
- }
- }<span style="color:#ff0000;">
- </span>
Host.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- public delegate void QuestionHandler(object sender,QuestionArgs e);
- public class Host
- {
- //定義一個事件
- public event QuestionHandler QuestionEvent;
- public QuestionArgs args { set; get; }
- public Host()
- {
- //初始化事件參數
- args = new QuestionArgs();
- }
- public string Name { get; set; }
- public void StartAnswer()
- {
- Console.WriteLine("開始答題");
- QuestionEvent(this, args);
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- public delegate void QuestionHandler(object sender,QuestionArgs e);
- public class Host
- {
- //定義一個事件
- public event QuestionHandler QuestionEvent;
- public QuestionArgs args { set; get; }
- public Host()
- {
- //初始化事件參數
- args = new QuestionArgs();
- }
- public string Name { get; set; }
- public void StartAnswer()
- {
- Console.WriteLine("開始答題");
- QuestionEvent(this, args);
- }
- }
- }
Guests.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- /// <summary>
- /// 父類
- /// </summary>
- public class Guests
- {
- /// <summary>
- /// 嘉賓姓名
- /// </summary>
- public string Name { get; set; }
- public virtual void answer(object sender, QuestionArgs e)
- {
- Console.Write("事件的發出者:" + (sender as Host).Name);
- Console.WriteLine("問題是:" + e.Message);
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- /// <summary>
- /// 父類
- /// </summary>
- public class Guests
- {
- /// <summary>
- /// 嘉賓姓名
- /// </summary>
- public string Name { get; set; }
- public virtual void answer(object sender, QuestionArgs e)
- {
- Console.Write("事件的發出者:" + (sender as Host).Name);
- Console.WriteLine("問題是:" + e.Message);
- }
- }
- }
GuestC.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- class GuestC:Guests
- {
- public override void answer(object sender, QuestionArgs e)
- {
- base.answer(sender, e);
- Console.WriteLine("{0}開始答題:我不知道", this.Name);
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- class GuestC:Guests
- {
- public override void answer(object sender, QuestionArgs e)
- {
- base.answer(sender, e);
- Console.WriteLine("{0}開始答題:我不知道", this.Name);
- }
- }
- }
GuestB.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- class GuestB:Guests
- {
- public override void answer(object sender, QuestionArgs e)
- {
- base.answer(sender, e);
- Console.WriteLine("{0}開始答題:我不知道", this.Name);
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- class GuestB:Guests
- {
- public override void answer(object sender, QuestionArgs e)
- {
- base.answer(sender, e);
- Console.WriteLine("{0}開始答題:我不知道", this.Name);
- }
- }
- }
GuestA.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- class GuestA:Guests
- {
- public override void answer(object sender, QuestionArgs e)
- {
- base.answer(sender, e);
- Console.WriteLine("{0}開始答題:我不知道", this.Name);
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace EventDemo
- {
- class GuestA:Guests
- {
- public override void answer(object sender, QuestionArgs e)
- {
- base.answer(sender, e);
- Console.WriteLine("{0}開始答題:我不知道", this.Name);
- }
- }
- }
運行結果:

