C#中delegate 與event的使用(C#事件-支持發布者/訂閱者模式) (轉)


From:  http://www.cnblogs.com/gzhnan/articles/1896296.html

 

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

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM