C#事件支持發布者/訂閱者模式,發布者將事件通知給訂閱者,而訂閱者在事件發生時調用已經注冊好的事件處理函數。
首先要在一個類中定義某種類型的委托和此種委托類型事件。然后在該類中通過一個函數,將該事件進行觸發。 當外部其他類有對該事件訂閱時候,其他類會轉去處理該事件的處理程序。從而完成信息的交流。這樣做,一個最大的好處就是事件觸發類不用關心該事件的所有處 理程序,只關心他自己的工作以及他所關心的事件即可。而對該事件感興趣的類會首先訂閱該事件,當該事件發生時會捕捉到事件信息,並轉去處理。
舉一個簡單的例子 有兩個類,機器mechine類,和維修工check類。mechine類在運行過程當中如果出現某種故障,他會拋出brokendown()信息。如果check類對該事件有訂閱,他會捕捉到該信息然后轉去心相應的處理程序。
using System;
class Mechine //定義一個發布者類
{
public delegate void delegateName(string name); //定義具有某種返回類型命令參數代理類型
public event delegateName eventName; //定義委托類型的事件
public void Fun()
{
if (eventName != null) //如果事件不等於空就是說有訂閱者注冊過該事件,也就是說觸發事件后有相應的事件處理函數被調用。
{
Console.WriteLine("報告,機器已經出現故障");
eventName(string _name); //在類中觸發該事件
}
}
}
class Check //有訂閱上述事件的類
{
public void Fix(string str)
{
Console.WriteLine("請讓"+str+"去進行修理");
}
}
class Program
{
static void Main()
{
Mechine mechine1 = new Mechine(); //實例化一個Mechine類
Check c1 = new Check();
mechine1.eventName += new Mechine.delegateName(c1.Fix);
//用當前類中Fix函數訂閱mechine類中eventName函數,注意這里Fix的函數結構要跟事件和代理的委托要相同(形參以及返回值全部相同),這樣當Mechine類中事件觸發時,系統會通知Check類轉到Fix函數。
Mechine.Fun("張三");
}
}
具體使用方法過程如下:
1.委托定義delegate
2.事件定義 event
3.事件觸發
4.事件訂閱以及處理
簡單的貓叫,老鼠跑,主人醒
using System;
using System.Collections.Generic;
using System.Text;
namespace DelegateEvent
{
public delegate void CatEventHandler(object sender, EventArgs e);
public class Cat
{
public event CatEventHandler CatEvent;
public void Scream(EventArgs e)
{
if (CatEvent != null) //有沒有訂閱
{
Console.WriteLine("貓叫……");
CatEvent(this, e);
}
}
public void Mouse(object sender,EventArgs e)
{
Console.WriteLine("老鼠跑……");
}
public void People(object sender, EventArgs e)
{
Console.WriteLine("主人醒……");
}
static void Main()
{
Cat cat = new Cat();
cat.CatEvent += new CatEventHandler(cat.Mouse);
cat.CatEvent += new CatEventHandler(cat.People);
cat.Scream(EventArgs.Empty);
Console.Read();
}
}
}