---------------------- ASP.Net+Android+IO開發S、.Net培訓、期待與您交流! ----------------------
委託就是以方法做參數進行傳遞,它定義的是方法的架構,如果用這個委託,所聲明的方法就必須按照給定的參數及返滬類型進行處理。
聲明委託的方式:delegate 傳回值類型 委託類型名(參數) 比如delegate void StringProcess(string s); 注意這裡的除了前面的delegate,剩下部分和聲明一個函數一樣,但是StringProcess不是函數名,而是委託類型名
儲存什麼樣的方法就聲明什麼類型(方法參數與傳回值)的委託。
聲明的委託是一種類型,就像int、Person一樣,如果要用的話還要聲明委託類型的變數,聲明委託類型變數的方式:StringProcess f1;
將委託類型變數指向函數 StringProcess sp = new StringProcess(SayHello),這樣就可以像調用普通函數一樣把sp當成函數用了。委託可以看做是函數的指標。整數可以用整數變數指向它,對象可以用物件變數指向它,函數也可以用委託變數指向它。和直接調用函數的區別:用委託就可以指向任意的函數,哪怕是之前沒定義的都可以,而不使用受限於那幾種。
將委託類型變數指向函數還可以簡化成StringProcess sp = SayHello,編譯器幫我們進行了new。但是不能sp=PrintIt(),因為這樣就成了函數調用。
例子: //1定義委託類型
delegate void DGSayHi(string name);
//2聲明委託類型對象
DGSayHi dgSayHi = null;
//2.1聲明一個 與 DGSayHi委託類型有相同 簽名的方法
void SayNiHao(string name2)
{
MessageBox.Show("您好啊~~~" + name2);
}
//2.2聲明一個 與 DGSayHi委託類型有相同 簽名的方法
void SayHi(string name2)
{
MessageBox.Show("Hi~~~" + name2);
}
//2.3聲明一個 與 DGSayHi委託類型有相同 簽名的方法
void SayJpa(string name2)
{
MessageBox.Show("OHaU~~~" + name2);
}
//2.4聲明一個 與 DGSayHi委託類型有相同 簽名的方法
void SayKor(string name2)
{
MessageBox.Show("AniASaiU~~~" + name2);
}
private void btnTest_Click(object sender, EventArgs e)
{
//3執行個體化 委派物件
dgSayHi = new DGSayHi(SayNiHao);
//3.1向委派物件中追加了一個方法
dgSayHi += SayHi;
//上句代碼 實際執行 如下
//dgSayHi = (DGSayHi) Delegate.Combine(dgSayHi, new DGSayHi(SayHi));
//4聲明一個新的委派物件
DGSayHi dgSayHi2 = new DGSayHi(SayJpa);
dgSayHi2 += SayKor;
//5將新委派物件 追加到 原來的委派物件中
dgSayHi += dgSayHi2;
//6.從委託中移除方法
dgSayHi -= SayJpa;
//dgSayHi = (DGSayHi) Delegate.Remove(dgSayHi, new DGSayHi(SayJpa));
//調用委派物件
dgSayHi("Lily");
//dgSayHi.Invoke("Lucy");
delegate:
使用Delegate的時候很多時候沒必要使用一個普通的方法,因為這個方法只有這個Delegate會用,並且只用一次,這時候使用匿名方法最合適。
匿名方法就是沒有名字的方法。3就是沒有名字的int對象。3+5就是兩個匿名int對象的相加,允許匿名對象,就允許匿名方法。
ProcessWordDelegatep = delegate(string s)
{
Console.WriteLine(s);
};
知道C#中有匿名方法,看到這種寫法知道是匿名函數即可。
多播委託
delegatevoidProcessWordDelegate(strings)
ProcessWordDelegated = new ProcessWordDelegate(SayHello)+newProcessWordDelegate(ToLower)
多播委託如何處理傳回值?
•委託綁定多個方法後,其中一個方法執行發生異常後面的方法還會繼續執行嗎?不會!
•一個重要的方法GetInvocationList();//返回一個Delegate[]類型。Delegate類是一個抽象類別,是所有委託的父類。
組合的委託必須是同一個類型
相當於建立了一個按照組合的順序依次調用的新委派物件。
委託的組合一般是給事件用的,用普通的委託的時候很少用
事件:
事件文法:event ProcessWordDelegate 例子 OnInt
加了event關鍵字實現事件機制的好處:用了event事件,不可以修改事件已經註冊的值;不可以冒充進行事件通知了。在IntUC類外部就不能通過OnInt(3)的方式調用註冊的委託了。只能+=、-=!
委託與事件的區別
委託和事件沒有可比性,因為委託是類型,事件是對象(可以理解為對委託變數的封裝。d),下面說的是委託的對象(用委託方式實現的事件)和(標準的event方式實現)事件的區別。事件的內部是用委託實現的。(舉例子:三種實現事件方式的區別)
因為對於事件來講,外部只能“註冊自己+=、登出自己-=”,外界不可以登出其他的註冊者,外界不可以主動觸發事件,因此如果用Delegate就沒法進行上面的控制,因此誕生了事件這種文法。add、remove。
事件是用來閹割委託執行個體的。事件只能add、remove自己,不能賦值。事件只能+=、-=,不能=、不能外部觸發事件。
總結:
委託的作用:
佔位,在不知道將來要執行的方法的具體代碼時,可以先用一個委託變數來代替方法調用(委託的傳回值,參數列表要確定)。在實際調用之前,需要為委託賦值,否則為null。
事件的作用:
事件的作用與委託變數一樣,只是功能上比委託變數有更多的限制。(比如:1.只能通過+=或-=來Binder 方法(事件處理常式)2.只能在類內部調用(觸發)事件。)
在自訂控制項(自己編寫控制項的時候,會大量用到.編寫控制項的時候,會寫一些事件。但是當這些事件 被觸發以後,具體執行的那些事件處理常式是編寫控制項的人沒法確定的。這個時候只能通過事件來佔位(調用),具體調用的是哪個方法,由使用控制項的人來決定(Click+=new 委託(方法名);))
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
詳細請查看:http://edu.csdn.net