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

}

posted @ 2010-12-04 12:55  代码缔造的帝国  阅读(562)  评论(0编辑  收藏  举报