委托 事件

委托delegate

之前學(xué)過的任何類型,不管是值類型還是引用類型,其變量都可以進行賦值,或者作為方法的參數(shù)進行傳遞,而如何引用方法或者把方法作為參數(shù)進行傳遞呢?這就需要用到委托-delegate.

申明方法

委托也是一種類型,它與類一樣,需要我們自己來定義。一種類型的方法

委托的定義如下:

delegate 返回值類型 委托類型名 (參數(shù))

例如:?

delegate void GreetDelegate(string name);?

定義時委托類型的返回值和參數(shù)與要引用的方法的返回值和參數(shù)一致,二者在外形上一樣,只是委托用delegate修飾.

委托的使用分以下三步:

1.委托聲明

2.委托實例化

3.委托調(diào)用

Greeting greet;?

greet = ChineseGreet;

?Greeting engGreet = new Greeting(EnglishGreet);

委托類似于函數(shù)指針,但與函數(shù)指針不同的是,委托是面向?qū)ο蟮?、類型安全的和保險的。委托既能引用靜態(tài)方法,也能引用實例方法。


委托是一個類,它定義了方法的類型,使得可以將方法當做另一方法的參數(shù)來進行傳遞,也即是方法的參數(shù)是一個委托變量,在調(diào)用此方法時,就可以把一個方法做為參數(shù)傳遞給委托變量;

委托對象的一個有用屬性是:可以使用 + 運算符將多個對象分配給一個委托實例。多播委托包含已分配委托的列表。在調(diào)用多播委托時,它會按順序調(diào)用列表中的委托。 注意:只能合并相同類型的委托。

當委托綁定多個有返回值的方法時,其結(jié)果是最后綁定的那個方法的返回值,前面綁定方法的返回值會被最后綁定方法的返回值所覆蓋,所以使用委托時一般不帶返回值.

一、委托和所引用的方法必須保持一致:

1.參數(shù)個數(shù)、類型、順序必須完全一致。

2.返回值必須一致。

二、一個委托被同時映射到靜態(tài)方法和實例方法,并分別返回特定的信息。


其它四種形式的委托

委托變量在綁定方法時,是把方法名賦值給了委托變量名,這樣就需要在類里面定義方法,而有些方法只用到了一次,這樣的方法在類里面過多時,程序的可讀性就不是太好,針對這種情況,可以使用匿名委托,即不用在類里面額外定義方法.

delegate定義的匿名委托

格式:

delegate(參數(shù)){

要執(zhí)行的代碼

};

參數(shù):相當于綁定方法的參數(shù){};里面相當于綁定方法的方法體由于是賦值,是一個語句,后面的;不要省

lambda表達式

格式:

(參數(shù))=>{

要執(zhí)行的代碼

};

參數(shù):相當于綁定方法的參數(shù){};里面相當于綁定方法的方法體由于是賦值,是一個語句,后面的;不要省

Func委托

格式:

Func<int,int,int>? s =delegate(int,int){

????return ?int;

};

使用Func泛型,前面兩個是參數(shù)類型,最后一個是返回值類型,其變量可以綁定匿名委托,lambda表達式和相同類型的方法,此種委托一定會有返回值;


Action委托

格式:

Action<string> action=delegate(string){

};

使用Action泛型,<>里面的類型是參數(shù)的類型,該種委托可以綁定匿名委托,lambda表達式和方法,但其一定沒有返回值.


事件event

委托也是一種類型,根據(jù)面向?qū)ο缶幊痰奶匦?通常會把一個類型的變量封裝到類的內(nèi)部,并把其設(shè)置成private的,然后通過屬性來訪問該變量,所以在實際編程時委托類型也會定義在類里面.

使用event關(guān)鍵字來修飾委托變量,其本質(zhì)上是委托變量的屬性.


在類的內(nèi)部,不管聲明它是public還是protected,他總是private的。即在類的外部,不能夠用“=”直接給屬性賦值,需用注冊“+=”和注銷“-=”的訪問限定符與聲明事件時使用的訪問限定符相同。

發(fā)送(或引發(fā))事件的類稱為“發(fā)行者”,接收(或處理)事件的類稱為“訂閱者”。事件的觸發(fā)必須在發(fā)行者內(nèi)部,在客戶端是不能觸發(fā)的.


由事件的特性引發(fā)出了一種設(shè)計模式-觀察者設(shè)計模式,該設(shè)計模式是為了定義對象間的一種一對多的依賴關(guān)系,以便于當一個對象的狀態(tài)改變時,其他依賴它的對象會被自動告知并更新,該設(shè)計模式包含以下兩個類:

被監(jiān)視對象:它往往包含其他對象所感興趣的內(nèi)容;

監(jiān)視者:用來監(jiān)視被監(jiān)視對象,當被監(jiān)視對象觸發(fā)事件時,監(jiān)視者能自動接收事件.


自己的理解:

委托或是事件申明都分三個部分:

委托者;委托;執(zhí)行委托者;

如果 委托者 和 執(zhí)行委托者 都是類,那么

委托者:委托的申明(也可以寫在類之外);事件的申明;委托觸發(fā)方法;

委托:寫在類外面;

委托執(zhí)行者:符合委托的執(zhí)行方法


調(diào)用的時候

委托:

實例化委托;

為委托進行和委托方法的綁定(可使用加減法);

調(diào)用委托類的觸發(fā)方法;


事件

實例化委托類;

為事件進行和委托方法的綁定(只能使用+= or -=);

調(diào)用委托類的觸發(fā)方法;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,544評論 19 139
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,688評論 9 118
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,607評論 30 472
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,365評論 6 13
  • 鏈接地址:http://www.cnblogs.com/liugang-vip/p/5616484.htmlhtt...
    青春前行閱讀 863評論 0 0

友情鏈接更多精彩內(nèi)容