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();

}

}

}