C#事件(Event)的理解
文章目錄
- C#事件(Event)的理解
- **事件的定義:**
- 事件的類型
C#事件(Event)的理解
事件的定義:
C# 事件(Event): 基本上說是一個(gè)用戶操作,如按鍵、點(diǎn)擊、鼠標(biāo)移動(dòng)等等,或者是一些提示信息,如系統(tǒng)生成的通知。應(yīng)用程序需要在事件發(fā)生時(shí)響應(yīng)事件。
事件是委托的一個(gè)實(shí)例。
事件需要在類中聲明。
事件使用 發(fā)布-訂閱(publisher-subscriber) 模型。
發(fā)布器(publisher) 是一個(gè)包含事件和委托定義的對(duì)象。事件和委托之間的聯(lián)系也定義在這個(gè)對(duì)象中。發(fā)布器(publisher)類的對(duì)象調(diào)用這個(gè)事件,并通知其他的對(duì)象。
訂閱器(subscriber) 是一個(gè)接受事件并提供事件處理程序的對(duì)象。在發(fā)布器(publisher)類中的委托調(diào)用訂閱器(subscriber)類中的方法(事件處理程序)。
事件的類型
事件一般分為兩種:
-
帶參數(shù)傳遞的
-
不帶參數(shù)傳遞的
基于上述的理解,實(shí)現(xiàn) .Net 框架中的事件需要三個(gè)步驟。
-
實(shí)現(xiàn)事件的發(fā)布類
-
實(shí)現(xiàn)事件的訂閱類
-
實(shí)現(xiàn)發(fā)布和訂閱的關(guān)聯(lián)(類似Qt中的信號(hào)關(guān)聯(lián))。
注意:
發(fā)布類里應(yīng)當(dāng)實(shí)現(xiàn):
1、事件的觸發(fā)(類似Qt中的發(fā)送信號(hào)emit signal));
2、事件的引發(fā)方法
訂閱類中應(yīng)當(dāng)實(shí)現(xiàn):
事件接收時(shí)的操作,(Qt 中信號(hào)槽Slot)
現(xiàn)在來看下面的兩個(gè)例子,如下:
1、不帶參數(shù)傳遞的事件
namespace SimpleEvent { /***********發(fā)布器類***********/public class EventTest{private int value; //定義一個(gè)參數(shù)public delegate void NumManipulationHandler();public event NumManipulationHandler ChangeNum;protected virtual void OnNumChanged(){if (ChangeNum != null){ChangeNum(); /* 事件被觸發(fā) */}else{Console.WriteLine("event not triggered");Console.ReadKey(); /* 回車?yán)^續(xù) */}}public EventTest() //構(gòu)造函數(shù){int n = 5;SetValue(n); //將值設(shè)置為5} public void SetValue(int n){// value = Console.ReadKey();if (value != n){value = n;OnNumChanged(); //當(dāng)前后的值放生變化的時(shí)候觸發(fā)事件}}}/***********訂閱器類***********/public class subscribEvent{public void printf(){Console.WriteLine("event has been triggered");Console.ReadKey(); /* 回車?yán)^續(xù) */}}/***********觸發(fā)***********/public class MainClass{public static void Main(){EventTest e = new EventTest(); /* 實(shí)例化發(fā)布者對(duì)象,第一次沒有觸發(fā)事件,屏幕上顯示“event not triggered" */subscribEvent v = new subscribEvent(); /* 實(shí)例化訂閱者對(duì)象 */e.ChangeNum += new EventTest.NumManipulationHandler(v.printf); /* 注冊(cè) */e.SetValue(7); //第二次觸發(fā)事件,屏幕上顯示event has been triggerede.SetValue(11); //第三次觸發(fā)事件,屏幕上顯示event has been triggered}} }2、帶參數(shù)傳遞的
namespace EventDemo {/// <summary>/// 發(fā)布事件的類/// </summary>public class TestEventSource{//定義事件參數(shù)類public class TestEventArgs : EventArgs{public readonly char KeyToRaiseEvent; //鍵盤值; public TestEventArgs(char keyToRaiseEvent){KeyToRaiseEvent = keyToRaiseEvent;}}//定義delegatepublic delegate void TestEventHandler(object sender, TestEventArgs e); //sender:事件發(fā)布者;e:傳遞事件的參數(shù)//用event 關(guān)鍵字聲明事件對(duì)象public event TestEventHandler TestEvent;//事件觸發(fā)方法protected virtual void OnTestEvent(TestEventArgs e){if (TestEvent != null)TestEvent(this, e); // 觸發(fā)事件;發(fā)布者不為空,即觸發(fā)事件}//引發(fā)事件public void RaiseEvent(char keyToRaiseEvent){TestEventArgs e = new TestEventArgs(keyToRaiseEvent); OnTestEvent(e);}}} namespace EventDemo {/// <summary>/// 監(jiān)聽事件的類/// </summary>public class TestEventListener{//定義處理事件的方法,他與聲明事件的delegate具有相同的參數(shù)和返回值類型public void KeyPressed(object sender, TestEventSource.TestEventArgs e){Console.WriteLine("發(fā)送者:{0},所按得健為:{1}", sender, e.KeyToRaiseEvent);}//訂閱事件public void Subscribe(TestEventSource evenSource){evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed); //將發(fā)布者的testEvent 方法與訂閱者的KeyPressed方法關(guān)聯(lián)}//取消訂閱事件public void UnSubscribe(TestEventSource evenSource){evenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed);}}} namespace EventDemo {class Program{static void Main(string[] args){//創(chuàng)建事件源對(duì)象TestEventSource es = new TestEventSource();//創(chuàng)建監(jiān)聽對(duì)象TestEventListener el = new TestEventListener();//訂閱事件Console.WriteLine("訂閱事件\n");el.Subscribe(es);//引發(fā)事件Console.WriteLine("輸入一個(gè)字符,再按enter鍵");string s = Console.ReadLine();es.RaiseEvent(s.ToCharArray()[0]);//取消訂閱事件Console.WriteLine("\n取消訂閱事件\n");el.UnSubscribe(es);//引發(fā)事件Console.WriteLine("輸入一個(gè)字符,再按enter健");s = Console.ReadLine();es.RaiseEvent(s.ToCharArray()[0]);}}}在上述例子中:
TestEventSource類。他就相當(dāng)于windows控件類一樣,是事件的源,里面包含有事件的聲明,以及存儲(chǔ)調(diào)用參數(shù)的事件參數(shù)類,以及事件的觸發(fā)方法。
TestEventListener類。他提供了事件處理程序,并實(shí)現(xiàn)了事件處理程序和事件對(duì)象的邦定。
Test 類,實(shí)例化自定義事件的事件源對(duì)象,并調(diào)用 TestEventListener類中的Subscribe(es);方法進(jìn)行事件對(duì)象和事件處理程序的邦定(訂閱事件),調(diào)用 TestEventSource類中的RaiseEvent(char keyToRaiseEvent)引發(fā)對(duì)象,并有對(duì)象所指定的委托回調(diào)處理事件。完成整個(gè)自定義事件。
其中 RaiseEvent(char keyToRaiseEvent) 就相當(dāng)于main()一樣是自定義事件的執(zhí)行入口, 從這個(gè)法開始—〉調(diào)用事件委托----〉查找訂閱事件程序找到事件所封裝的方法集----〉由委托回調(diào)事件處理程序并傳遞參數(shù)—〉執(zhí)行事件處理程序。
總結(jié)
以上是生活随笔為你收集整理的C#事件(Event)的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#接口(Interface)理解
- 下一篇: C#泛型的简单理解