《C#程序設計》課件第7章委托與事件_第1頁
《C#程序設計》課件第7章委托與事件_第2頁
《C#程序設計》課件第7章委托與事件_第3頁
《C#程序設計》課件第7章委托與事件_第4頁
《C#程序設計》課件第7章委托與事件_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

委托與事件思政目標:

?科學觀念對學習有決定性作用,通過編程培養(yǎng)科學觀念

?通過委托與事件的學習,提高抽象思維能力技能要求:

?掌握委托與事件的基本概念

?了解委托與事件的使用

?了解匿名方法與普通方法的區(qū)別、匿名類的創(chuàng)建Lambda表達式的使用實踐目標:

?根據(jù)示例,對所學的概念進行驗證

?熟練應用面向?qū)ο蠓椒▽崿F(xiàn)編程設計第7章委托事件匿名方法Lambda表達式委托01PART委托的作用在于:可以將方法引用封裝在委托對象內(nèi),然后可以將該委托對象傳遞給可調(diào)用所引用方法的代碼,而不必在編譯時知道將調(diào)用哪個方法。通俗的說就是:通過委托,我們可以把方法當成參數(shù)傳遞。委托和類相同,是一種用戶自定義的類型。類的表示是通過數(shù)據(jù)和方法進行集合,而委托則持有一個或多個方法,以及一系列預定義操作。委托的使用要注意以下五個內(nèi)容:(1)聲明一個委托類型。委托聲明和方法聲明相似,只是沒有實現(xiàn)塊。(2)使用該委托類型聲明一個委托變量。(3)調(diào)用委托與調(diào)用方法的語法相同。調(diào)用委托時,其包含的每一個方法都會被執(zhí)行。(4)創(chuàng)建委托類型的對象,賦值給委托變量。其中,新的委托對象包括指向某個方法的引用。這個方法和第一步定義的簽名和返回類型一致。(5)委托對象可增加其他方法。這些方法必須與第一步中定義的委托類型有相同的簽名和返回類型。委托的定義委托1.聲明委托委托的使用委托是類型,與類的聲明相同,委托類型必須在被用來創(chuàng)建變量以及類型的對象之前聲明。委托的聲明看上去與方法的聲明很相似,有返回類型和簽名。返回類型和簽名指定了委托接受的方法的形式。委托的聲明與方法的聲明不同之處是,委托以delegate關鍵字開頭,且沒有方法主體。委托此句聲明一個委托,其中,MyDelegate即為該句所聲明的委托名字。該委托能夠指向的方法簽名特性是:返回值為int類型,兩個參數(shù),且兩個參數(shù)都是int類型。若參數(shù)類型不同,則需要考慮參數(shù)的順序問題。2.實例化委托的使用委托是引用類型,因此有引用和對象。在委托類型聲明之后,我們可聲明變量并創(chuàng)建類型的對象委托經(jīng)過此句的實例化,pMethod以后可以代替myMethod()方法來執(zhí)行任務。3.調(diào)用委托的使用調(diào)用委托和調(diào)用方法類似。用于調(diào)用委托的參數(shù)將會用于調(diào)用列表中的每一個方法,其格式如下:pMethod(參數(shù)列表);委托3.調(diào)用委托的使用委托多播委托委托多播委托就是可以引用的多個函數(shù)的委托,其本質(zhì)是對System.MulticastDelegate類(為System.Delegate的子類)的繼承和實現(xiàn)。一般情況下,多播委托的返回值為void。另外,雖然使用多播委托可以按照順序調(diào)用多個方法,但最終的結果只能是從其所調(diào)用的最后一個方法中得到。多播委托給委托添加方法調(diào)用的方式是使用運算符"+"和"+=",同樣,給委托刪除方法調(diào)用的方式是使用運算符"-"和"-="多播委托委托多播委托和單播委托的調(diào)用方式一樣,但在執(zhí)行時,多播委托會依次執(zhí)行所有指向的方法序列。例如,將上面的代碼依次執(zhí)行method1、method2和method3從執(zhí)行結果可以看到:(1)多播委托中各個方法都會被執(zhí)行,且執(zhí)行順序與+=的操作順序一樣。(2)多播委托如果有返回值,則只返回最后一個函數(shù)的執(zhí)行結果事件02PART事件事件的使用方法和委托相關,下面通過一個例子來了解事件。校園運動會的長跑項目中,裁判員一般是通過打槍的方式表示比賽開始,參加長跑的同學在聽到槍聲后起跑,其中槍聲是事件,裁判員通知該事件發(fā)生,而參加長跑的同學在聽到槍聲后起跑就是這個事件發(fā)生后的動作。另外,不參加長跑的同學對槍聲不會有反應。在此過程中,有兩個主要方:產(chǎn)生事件的對象(裁判員)和接收事件的對象(參加該項目的同學),其中,產(chǎn)生事件的對象也稱為事件發(fā)生者或事件觸發(fā)者,接收事件的對象也稱為事件訂閱者或事件接收者事件事件的使用在所有類之外為事件定義一個public修飾的委托,由于事件為多播委托,故定義時返回類型應為void事件1.定義事件委托事件的使用使用事件,需要有事件觸發(fā)的源頭,故應先定義一個事件觸發(fā)類,然后在該類內(nèi)部使用event關鍵字與上述委托一起定義一個public的事件事件2.定義事件觸發(fā)類(用于產(chǎn)生事件)該類中,當特定的動作發(fā)生或消息到達時就觸發(fā)所定義的事件,一般用一個方法完成事件觸發(fā)。事件的使用MyEventArgs可以為自定義參數(shù)類型,也可以為內(nèi)置類型,當然也可以不要該參數(shù)。這樣,外界即可通過如圖下來觸發(fā)事件事件2.定義事件觸發(fā)類(用于產(chǎn)生事件)eventSrcInstance即eventSrcClass實例化對象。事件的真正觸發(fā)代碼即在該方法中。一般地,發(fā)生事件時,第一個參數(shù)為事件產(chǎn)生類(觸發(fā)類),第二個參數(shù)為System.EventArgs類或其派生類類型,該類可用于向事件接收方傳遞一些數(shù)據(jù),其一般樣式如下事件的使用someData為EventArgs類的子類的實例化對象。若無須向事件接受方傳遞任何參數(shù),則可以使用事件2.定義事件觸發(fā)類(用于產(chǎn)生事件)在事件觸發(fā)方法中,完成事件觸發(fā)處理的代碼如下事件的使用事件觸發(fā)類的核心代碼事件2.定義事件觸發(fā)類(用于產(chǎn)生事件)事件的使用一般該類為主要業(yè)務類,即主要功能在此類中。在該類中需準備一個事件處理方法,該事件處理方法必須符合委托所聲明的方法簽名。一般地,用于處理事件的方法名稱習慣以On開頭事件3.定義事件接收類(用于處理事件)定義事件觸發(fā)類的實例,然后完成事件訂閱,表明事件發(fā)生后,將由哪個方法來處理。三類事件定義一個無參數(shù)的委托事件1.無參類型三類事件下面定義一個帶參數(shù)的委托類型,參數(shù)類型使用EventArgs類事件2.帶參類型三類事件事件2.帶參類型該示例使用的是有參數(shù)的事件,不過事件的第二個參數(shù)是內(nèi)置的EventArgs類型,并且沒有傳入數(shù)據(jù)。另外,從示例中也可以看出事件基于多播委托,所以事件是委托的一種特例。所有訂閱了事件的處理方法在事件發(fā)生后,都被通知到并且都完成執(zhí)行。三類事件事件3.自定義參數(shù)類型除上述兩種方式外,還可以通過EventArgs派生自己的參數(shù)類型,并在事件中使用它來進行數(shù)據(jù)的傳遞,此時需要從EventArgs類派生一個符合自己要求的類,用作參數(shù)類型三類事件事件3.自定義參數(shù)類型根據(jù)前面所講述的方法來定義事件及相關類(1)事件觸發(fā)類決定發(fā)送事件的時間,事件接收者決定執(zhí)行響應事件的操作。(2)沒有訂閱者的事件不會被觸發(fā)。(3)一個事件可以有多個訂閱響應者,一個訂閱者可以響應多個事件。(4)具有多個訂閱者的事件一旦被觸發(fā),就會同步調(diào)用多個事件處理程序。(5).NET中的事件是基于EventHandler委托和EventArgs參數(shù)的。匿名方法03PART匿名方法匿名方法匿名方法就是沒有名稱的方法,除此之外,它和普通方法沒有什么區(qū)別。匿名方法使用時是通過delegate修飾。匿名方法聲明的一般形式如下:委托名委托實例對象=delegate(參數(shù)1,參數(shù)2,…){方法體;};匿名方法匿名方法匿名方法僅適用于小代碼量的情況,它可以帶參數(shù)。使用匿名方法時,可以在有需要的時候直接寫方法體,不必事先聲明一個與委托匹配的方法。除上述內(nèi)容以外,使用匿名方法時,還需要注意如下四點:(1)(參數(shù)1,參數(shù)2,…)用于給匿名方法傳遞參數(shù)。(2)匿名方法的參數(shù)列表,即(參數(shù)1,參數(shù)2,…)中各個參數(shù)不能省卻參數(shù)類型。(3)匿名方法本身不能脫離賦值環(huán)節(jié),即“delegate(參數(shù)1,參數(shù)2,…){方法體;};”是非法的。(4)如果沒有參數(shù)列表,即形如“delegate{方法體;};”時,該匿名方法可以賦給任意委托對象。Lambda表達式04PARTLambda表達式Lambda表達式Lambda表達式本質(zhì)上是匿名方法,它可以減少代碼量,使代碼更加簡潔、優(yōu)美。方法需要依附于委托,故Lambda表達式的書寫也要遵從委托的“規(guī)定”。其一般形式如下:(參數(shù)列表)=>{語句序列}在使用Lambda表達式時,需要注意以下六點。(1)參數(shù)列表中的參數(shù)數(shù)目并不固定,具體需要幾個參數(shù)是由相應的委托確定。另外,在參數(shù)列表中只有一個參數(shù)時,可以省去列表外側(cè)的一對括號(),否則不可以。(2)如果編譯器能夠推斷出參數(shù)的類型,則參數(shù)列表中可以不加參數(shù)的類型,但需要有參數(shù)名稱。(3)如果委托有返回值類型,則Lambda表達式也必須返回相同類型的值。(4)委托聲明時對參數(shù)使用了ref或out修飾,則Lambda表達式中也必須帶上ref或者out,且不能省去參數(shù)類型。(5)當右側(cè)的語句序列中只有一條語句時,大括號可以省去,否則不可以。(6)右側(cè)語句序列有返回值時,必須使用return語句;若右側(cè)語句序列中只有一個語句時,可以省去return語句。Lambda表達式Lambda表達式Lambda表達式的語法上面的Lambda表達式等價于Lambda表達式Lambda表達式2.書寫三個Lambda表達式Lambda表達式Lambda表達式3.賦值因為Lambda表達式是匿名方法,所以Lambda表達式可以像匿名方法一樣賦給委托實例對象這個問題也可以通過下面這種方法理解:委托表達式就是一個方法,如:“(x,y)=>x+y;”是一個Lambda表達式,那它就是一個方法,假如該方法記為A,即“A=(x,y)=>x+y;”(類似

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論