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

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

c# 委托與事件

2019-11-17 02:29:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

c# 委托與事件

一直都是只會(huì)用,不太明白,今天看了這篇文章還是有所收貨的,轉(zhuǎn)載一下·····原文地址:C#委托與事件_1544作者:馮憶柳3.10.2 聲明事件在3.2.3小解中,講授了事件的基礎(chǔ)概思,事件具有以下特色:q 事件通常使用委托事件處置程序入止聲明。q 事件一直通知對(duì)象消息并唆使須要執(zhí)行某類操作的一類方法。q 發(fā)行者肯定何時(shí)引發(fā)事件,訂閱者肯定執(zhí)行何類操作來(lái)響應(yīng)當(dāng)事件。q 一個(gè)事件可以有少個(gè)訂閱者。一個(gè)訂閱者可處置來(lái)自少個(gè)發(fā)止者的少個(gè)事件。q 出有訂閱者的事件永久不會(huì)被調(diào)用。q 事件通常用于通知用戶操作,例如,圖形用戶界面中的按鈕雙打或者菜雙挑選操作。q 假如一個(gè)事件有多個(gè)訂閱者,該引發(fā)當(dāng)事件時(shí),會(huì)同步伐用多個(gè)事件處理程序,也可以使用異步處理多個(gè)事件。事件和方法一樣,通常事件和方法一同使用,事件和委托一樣具有簽名,但是事件的簽名通過(guò)委托類型來(lái)訂義,示例方法代碼如下所示。public delegate void MyDel(object sender, EventArgs e); //聲明一個(gè)委托public class Event //編寫(xiě)事件類{public event MyDel EventTest; //聲明一個(gè)事件public void EventTestMethod() //編寫(xiě)事件方法{Console.WriteLine("事件被使用"); //輸出字串}}上述代碼中,聲明了一個(gè)委托,聲明委托后,正在Event類中聲亮了一個(gè)事件,那個(gè)事情綁訂到拜托MyDel。在事件的簽名中,第一個(gè)參數(shù)為援用事件流的對(duì)象,第兩個(gè)參數(shù)為一個(gè)傳送與事件相干的數(shù)據(jù)的類。在C#中,規(guī)范的代碼編寫(xiě)可以讓代碼更具可讀性,BB霜。3.10.3 引發(fā)事件假如要引發(fā)事件,類可以調(diào)用委托,并傳送一切取事件有閉的參數(shù)。上里的章節(jié)中道到,事件通常和委托一同使用,并且通功給委托發(fā)送疑作,來(lái)引發(fā)事件。假如該事件出有任何處理程序,則彼事件為空,所以在引發(fā)事件之前,必需先肯定當(dāng)事件沒(méi)有為空,否則會(huì)扔出NullReferenceException非常,引發(fā)事件代碼如下所示。public delegate void MyDel(object sender, EventArgs e); //創(chuàng)立拜托public class Event //編寫(xiě)事件類{public event MyDel EventTest; //聲明一個(gè)事件public void EventTestMethod() //聲明一個(gè)事件所施行的法子{MyDel OnLoad = EventTest; //聲明事件的方法if (OnLoad != null) //斷定事件能否為空{(diào)OnLoad(this, EventArgs()); //不為空則使用委托}}}每一個(gè)事件皆可以分配多個(gè)程序來(lái)接管該事件,這樣,事件主動(dòng)調(diào)用每個(gè)吸收器,當(dāng)有多個(gè)接受器時(shí),引發(fā)事件只須要調(diào)用一次事件。3.10.4 訂閱事件事件可以像一個(gè)方法一樣,若要接納某個(gè)事件的類,可以創(chuàng)建一個(gè)方法來(lái)接收該事件,交收事件的類像類事件本身加加方法的委托,這個(gè)被稱作“訂閱事件”,可以道,和平時(shí)上網(wǎng)中的rss訂閱整個(gè)進(jìn)程很像。值得注意的是,接受器必需具有取事件本身雷同的簽名的法子,然后當(dāng)辦法能力采用恰當(dāng)?shù)牟僮鰜?lái)呼應(yīng)事件,示例代碼如下所示。public class EventReceiver //創(chuàng)修一個(gè)接管器{public void EventTestReceiver(object sender, EventArgs e) //辦法的簽名必需雷同{Console.WriteLine("自" + sender.ToString() + "引收了一個(gè)事情"); //施行方式體}}每一個(gè)事件可以分配多個(gè)程序來(lái)接收該事件,也就是道可以有多個(gè)接收器。多個(gè)接納器由流依照次序調(diào)用。假如一個(gè)吸收呈現(xiàn)非常,則出有接納的交收器會(huì)接收事件。假如要訂閱事件,交收器必須創(chuàng)建一個(gè)與事件具有同品種型的委托,并使用事件處理委托的目的,這也就是為什么事件通常情形下會(huì)與委托一同使用。示例代碼如下所示。public void EventTestSubscribe(Event eve){MyDel del = new MyDel(EventTestReceiver); //聲明委托eve.EventTest += del; //增添事件}上述代碼中,通過(guò)“+=”運(yùn)算符訂閱了一個(gè)事情,同樣,也能夠使用“-=”號(hào)撤消訂閱。示例代碼如下所示。public void EventTestSubscribe(Event eve){MyDel del = new MyDel(EventTestReceiver); //聲亮拜托eve.EventTest -= del; //撤消事件}3.10.5 委托和事件上面幾節(jié)中離開(kāi)講授委托和事件,關(guān)于始教者而行,委托和事件是很難教習(xí)的學(xué)問(wèn),但是當(dāng)進(jìn)修過(guò)委托和事件之后,會(huì)發(fā)明委托和事件十分的簡(jiǎn)略。在asp.net啟發(fā)當(dāng)中,良多控件皆使用了委托和事件。例如當(dāng)雙打一個(gè)按鈕控件時(shí),按鈕會(huì)發(fā)送信息唆使“引發(fā)了一個(gè)按鈕事件”,然后發(fā)送給相當(dāng)?shù)奈掌鳎庸芷鹘邮芰税l(fā)來(lái)的信息自而引發(fā)相當(dāng)?shù)牟僮鳌T诹私馕泻褪录幕A(chǔ)概思后,下列代碼闡明了怎樣一步步的使用委托和事件。為了完成播送喇叭功效(相似QQ的談天窗心的系統(tǒng)疑息),利用程序中沒(méi)有僅有用戶的談天窗心,也包含系統(tǒng)發(fā)送窗心。系統(tǒng)能夠給用戶的談天窗口發(fā)送系統(tǒng)信息,正在運(yùn)用程序中,不只需求播送用戶的信息,同樣體系也可以狹播系統(tǒng)信作。為了完成那一功效,首先,須要?jiǎng)?chuàng)立一個(gè)委托,示例代碼如下所示。public delegate void BetaDel string str); //創(chuàng)修一個(gè)委托在創(chuàng)修了委托后,便要為寫(xiě)方法,示例代碼如下所示。public delegate void BetaDel(string str);public static void Output(string str) //用戶收送疑作方式{Console.WriteLine("用戶發(fā)送給你一個(gè)消息"); //輸出用戶提醒信息}public static void SystemOutput(string str) //系統(tǒng)發(fā)送信息方法{Console.WriteLine("系統(tǒng)發(fā)送給你一個(gè)消息"); //輸出用戶提醒信息}public static void OutputChoose(string str,BetaDel del) //使用委托變質(zhì){del(str);}注意:在上述代碼中,del是一個(gè)委托變質(zhì),del(str)會(huì)依照方法的簽名在委托的方法表中執(zhí)行。上述代碼,取del(string str)簽名相同的方法有Output和SystemOutput,他們的方式簽實(shí)雷同。正在主函數(shù)中,能夠通功委托來(lái)使用辦法,示例代碼如下所示。static void Main(string[] args){OutputChoose("您佳", Output); //通功傳送方法稱號(hào)來(lái)使用方法Console.ReadKey();}上述代碼中,使用了OutputChoose方法。值得注意的是,在OutputChoose方法中,400電話,其中的一個(gè)參數(shù)是方法名稱。由于通過(guò)委托,可以將方法名稱做為參數(shù)入行傳送,自而執(zhí)行了相當(dāng)?shù)姆椒āV档米⒁獾氖牵谏鲜龃a中,委托等方法全體皆聲明在一個(gè)類中,由于這樣可以便利懂得,但是那樣便沒(méi)有具有里背對(duì)于象的特色,面背對(duì)象的特性便是封裝,封裝能讓代碼具有構(gòu)造性,于是可以使用事件。創(chuàng)立一個(gè)類,類稱號(hào)鳴OutputChoose,示例代碼如下所示。using System;using System.Collections.Generic;using System.Linq;using System.Text; //使用系統(tǒng)命名空間namespace beta{class OutputChoose{public string message="您有新欠消息,請(qǐng)注意查收"; //聲明欠音訊字串public delegate void BetaDel(string str); //訂義委托注冊(cè)事件public event BetaDel MyEvent; //聲明事件public void OnLoad() //編寫(xiě)OnLoad方法注冊(cè)事件{if (MyEvent != null){MyEvent(message); //當(dāng)具有事件時(shí),調(diào)用所有注冊(cè)對(duì)象的方法}}}}上述代碼將前里代碼中的方法入止了封裝做為委托。然后加加一個(gè)用戶新聞?lì)悾惷麨閁serMessage,示例代碼如下所示。using System.Linq;using System.Text; //使用白原處置命實(shí)空間namespace beta //聲亮該前途序命實(shí)空間{class UserMessage{public void Output(string str) //輸出方法{Console.WriteLine("用戶收送給您一個(gè)新聞:" + str); //簡(jiǎn)略的輸出}}}再加加一個(gè)體系新聞?lì)悾惙Q號(hào)為SystemMessage,示例代碼如下所示。using System.Linq;using System.Text; //使用白原處理命名空間namespace beta //聲明該前途序命名空間{class SystemMessage{public void SystemOutput(string str) //系統(tǒng)獲與輸出方法{Console.WriteLine("體系發(fā)送給你一個(gè)音訊:" + str);//顯式系統(tǒng)發(fā)送的音訊}}}在主函數(shù)中,可以觸發(fā)事件來(lái),示例代碼如下所示。static void Main(string[] args){OutputChoose opc = new OutputChoose(); //聲明一個(gè)類的對(duì)于象SystemMessage msg = new SystemMessage();opc.MyEvent += msg.SystemOutput; //注冊(cè)法子opc.OnLoad(); //開(kāi)端主動(dòng)調(diào)用一切注冊(cè)的方法Console.ReadKey();}上述代碼中,OnLoad()觸發(fā)了之前注冊(cè)的事件,并施行事件,運(yùn)轉(zhuǎn)成果如圖3-8所示。圖3-8委托和事件的綜合用例運(yùn)轉(zhuǎn)成果顯示,當(dāng)創(chuàng)建了一個(gè)對(duì)象,對(duì)象可以注冊(cè)聲明事件,由于該對(duì)象沒(méi)有真隱該事件的方法的詳細(xì)真隱,但是在事件中增長(zhǎng)了方法,相似于在該類中增添了一個(gè)方法,而在該類的編碼完成中,定義了一個(gè)OnLoad方法來(lái)調(diào)用一切注冊(cè)對(duì)于象的方法。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 吉安市| 沅江市| 勃利县| 广德县| 精河县| 长寿区| 梁平县| 邵阳市| 蒙山县| 朝阳市| 临夏县| 安图县| 景德镇市| 顺平县| 津南区| 广灵县| 武功县| 赤峰市| 西城区| 辽源市| 尉犁县| 眉山市| 大竹县| 罗城| 罗田县| 白河县| 长岭县| 永安市| 桑日县| 吕梁市| 绥棱县| 博客| 静安区| 深泽县| 察隅县| 神农架林区| 满洲里市| 松江区| 县级市| 汨罗市| 巩义市|