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

來源:互聯網
上載者:User
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();
        }
    }

}

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

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.