1.事件與委托的關系
委托是一種類型
事件是委托的一個實例
事件中涉及兩種角色——事件發布者和事件訂閱者。
事件發布者: 觸發事件的對象稱為事件發布者。
事件訂閱者: 捕獲事件並對其做出處理的對象稱為事件訂閱者。
2.事件的實例說明
namespace MyEvent { //委托的聲明 public delegate void DoSometing(); /// <summary> /// 委托與事件的關系 /// 委托是一種類型 /// 事件是委托的一個實例 /// </summary> public class MyEvent { public DoSometing doSomethingDelegate;//委托的一個變量 public event DoSometing doSomethingEvent;//一個事件,就是委托的一個變量,加上了event關鍵字 //事件的使用 public void Invoke() { if (doSomethingEvent != null) { doSomethingEvent(); } } } } namespace MyEvent { class Program { static void Main(string[] args) { Console.WriteLine("歡迎來到流星小子博客學習"); MyEvent myEvent = new MyEvent(); // myEvent.doSomethingEvent += new DoSometing(ShowSomething); myEvent.doSomethingEvent += ShowSomething;//為事件實例化 myEvent.Invoke();//觸發事件 Console.Read(); } private static void ShowSomething() { Console.WriteLine("ShowSomething"); } } }
3. 事件的發布者與訂閱者實例
//新郎官,充當事件發布者角色
public class Bridegroom
{
//自定義委托
public delegate void MarryHandler(string msg);
//定義事件
public event MarryHandler MarryEvent;
//發布事件
public void OnMarriageComing(string msg)
{
if(MarryEvent != null)
{
MarryEvent(msg);
}
}
}
public class Friend
{
//屬性
public string Name { get; set; }
//構造函數
public Friend(string name)
{
Name = name;
}
//事件處理函數,該函數需要符合 MarryHandler委托的定義
public void SendMessage(string message)
{
//輸出通知信息
Console.WriteLine(message);
//對事件做出處理
Console.WriteLine(this.Name + "收到了,到時候准時參加");
}
}
static void Main(string[] args)
{
Bridegroom bridegroom = new Bridegroom();
Friend friend1 = new Friend("張三");
Friend friend2 = new Friend("李四");
Friend friend3 = new Friend("王五");
//使用 “+=” 來訂閱事件
bridegroom.MarryEvent += new Bridegroom.MarryHandler(friend1.SendMessage);
bridegroom.MarryEvent += friend2.SendMessage;
//發出通知,此時只有訂閱了事件的對象才能收到通知
bridegroom.OnMarriageComing("朋友門,我要結婚了,到時候准時參加婚禮!");
Console.WriteLine("---------------------------------------------");
//使用 “-=” 來取消事件訂閱,此時李四將收不到通知
bridegroom.MarryEvent -= friend2.SendMessage;
//使用 “+=” 來訂閱事件,此時王五可以收到通知
bridegroom.MarryEvent += friend3.SendMessage;
//發出通知
bridegroom.OnMarriageComing("朋友門,我要結婚了,到時候准時參加婚禮!");
Console.Read();
}
4. 輸出結果

