委托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ā)方法;