C#中delegate 与event的使用(C#事件-支持发布者/订阅者模式)
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();
}
}
}