国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C#基礎(chǔ)加強(qiáng)篇—委托、Lambda表達(dá)式和事件(下)

2019-11-17 02:30:27
字體:
供稿:網(wǎng)友

C#基礎(chǔ)加強(qiáng)篇—委托、Lambda表達(dá)式和事件(下)

3.事件

事件作為C#中的一種類型,為類和類的實(shí)例定義發(fā)出通知的能力,從而將事件和可執(zhí)行代碼捆綁在了一起。事件是對象發(fā)送的消息,以發(fā)信號通知操作的發(fā)生。操作可能是由用戶交互引起的,也可能是由某些其他的程序邏輯觸發(fā)的。引發(fā)(觸發(fā))事件的對象叫做事件發(fā)送方,捕獲事件并對其做出響應(yīng)的對象叫做事件接收方。

C#事件是按“發(fā)布——預(yù)定”的方式工作。先在一個(gè)類中公布事件,然后就可以在任意數(shù)量的類中對事件預(yù)定。在事件通信中,事件發(fā)送方類并不知道哪個(gè)對象或方法將接收到(處理)它所引發(fā)的事件。所需要的是在源和接收方之間存在一個(gè)媒介(或類似指針的機(jī)制),這一媒介就是委托。

事件功能是由3個(gè)互相聯(lián)系的元素提供:提供事件數(shù)據(jù)的類、事件委托和引發(fā)事件的類。如果想要類引發(fā)名為EventName的事件,需要以下元素:

(1)持有事件數(shù)據(jù)的類:名為EventNameEventArgs。該類必須繼承System.EventArgs類。如果不自定義持有事件數(shù)據(jù)的類,就使用System.EventArgs類。

(2)事件的委托:名為EventNameEventHandler

(3)引發(fā)該事件的類。該類必須提供:

a.事件聲明:public event EventNameEventHandler EventName;

b.引發(fā)事件的方法:名為OnEventName

(4)定義使用此事件的類。所有這些類都應(yīng)該包括:

創(chuàng)建事件源對象。使用定義的構(gòu)造函數(shù)創(chuàng)建包含事件定義的類的對象。

定義事件處理程序,也就是定義與事件關(guān)聯(lián)的方法。

將事件源對象注冊到事件處理處理程序。使用委托對象和“+=”運(yùn)算符和“-=”運(yùn)算符將一個(gè)或多個(gè)方法與事件源中的事件關(guān)聯(lián)。

C#事件機(jī)制基于委托實(shí)現(xiàn),首先要定義一個(gè)委托:

public delegate void EventHandler(object from,myEventArgs e); //from表示發(fā)生事件的對象

聲明事件的格式:event 事件的委托名 事件名

public event EventHandler TextOut;

事件的激活一般寫成:

if(TextOut!=null)

TextOut(this,new EventArgs());

訂閱事件 += evsrc.TextOut+=new EventSource.EventHandler(CatchEvent);

取消訂閱 -= evsrc.TextOut-=new EventSource.EventHandler(CatchEvent);

下面再來看一個(gè)示例:

 1   public class MyEventArgs:EventArgs 2     { //定義事件包含數(shù)據(jù) 3         4         PRivate string StrText; 5         public MyEventArgs(string StrText) 6         { 7             this.StrText = StrText; 8         } 9         public string GetStrText10         {11             get12             {13                 return StrText;14             }15         }16     }17 18     public class EventSource19     {//發(fā)布事件的類20        21         MyEventArgs EvArgs = new MyEventArgs("觸發(fā)事件");22         public delegate void EventHandler(object from, MyEventArgs e);//定義委托23         public event EventHandler TextOut;//定義事件24         public void TriggerEvent()//激活事件的方法25         {26             if(TextOut!=null)27             {28                 TextOut(this, EvArgs);29             }30         }31     }  32     class Test33     {//訂閱事件的類34         static void Main(string[] args)35         {36             EventSource evsrc = new EventSource();37             evsrc.TextOut += new EventSource.EventHandler(CatchEvent);//訂閱事件38             evsrc.TriggerEvent();//觸發(fā)事件39             Console.WriteLine("--------------");40 41             evsrc.TextOut -= new EventSource.EventHandler(CatchEvent);//取消訂閱事件42             evsrc.TriggerEvent();//由于訂閱已取消,什么也不執(zhí)行43             Console.WriteLine("--------------");44 45             Test theApp=new Test();46             evsrc.TextOut += new EventSource.EventHandler(theApp.InstanceCatch);47             evsrc.TriggerEvent();48         }49         private static void CatchEvent(object from, MyEventArgs e)50         {//事件處理程序51             Console.WriteLine("CatchEvent:{0}", e.GetStrText);52         }   53         private void InstanceCatch(object from, MyEventArgs e)54         {//事件處理程序55             Console.WriteLine("InstanceCatch:{0}", e.GetStrText);56         }57     }

可以對照著上面的介紹,來找一下事件的幾個(gè)相關(guān)元素。

委托、Lamada表達(dá)式、事件的一些基礎(chǔ)知識完。。。。

這是我第一次寫博客,本人也還是在大學(xué)里摸索的渣渣,幾乎都是書上的一些內(nèi)容,感覺自己一個(gè)字一個(gè)字打出來印象會比較深刻,理解也更到位,大神勿噴。。。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 凌海市| 天柱县| 开江县| 宁陕县| 武清区| 钦州市| 新邵县| 昭觉县| 麻阳| 嘉善县| 萝北县| 定陶县| 安陆市| 莱州市| 西宁市| 定边县| 石河子市| 新巴尔虎左旗| 梁平县| 大同市| 屏山县| 蒙阴县| 贵阳市| 来安县| 重庆市| 客服| 永康市| 襄垣县| 密山市| 湟中县| 寻乌县| 五寨县| 罗江县| 上犹县| 加查县| 咸宁市| 宜州市| 革吉县| 临西县| 大姚县| 武山县|