委託與事件

2021-06-16 18:35:16 字數 2315 閱讀 3694

委託就是以方法做引數進行傳遞,它定義的是方法的框架,如果用這個委託,所宣告的方法就必須按照給定的引數及返滬型別進行處理。

宣告委託的方式: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;

宣告乙個 與 dgsayhi委託型別有相同 簽名的方法

void saynihao(string name2)

宣告乙個 與 dgsayhi委託型別有相同 簽名的方法

void sayhi(string name2)

宣告乙個 與 dgsayhi委託型別有相同 簽名的方法

void sayjpa(string name2)

宣告乙個 與 dgsayhi委託型別有相同 簽名的方法

void saykor(string name2)

private void btntest_click(object sender, eventargs e)

;知道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.只能通過+=或-=來繫結方法(事件處理程式)2.只能在類內部呼叫(觸發)事件。)

在自定義控制項(自己編寫控制項的時候,會大量用到.編寫控制項的時候,會寫一些事件。但是當這些事件 被觸發以後,具體執行的那些事件處理程式是編寫控制項的人沒法確定的。這個時候只能通過事件來佔位(呼叫),具體呼叫的是哪個方法,由使用控制項的人來決定(click+=new 委託(方法名);))

委託與事件

1.建立乙個類,分別建立加 減 乘 除四個方法,通過委託和事件,實現 輸入兩個計算數,完成所有的四個方法的呼叫,計算出結果顯示。建立乙個警察 policeman 類,乙個小偷 thief 類,例項化兩個類的物件,當policeman類中警笛鳴響 alarm 方法執行時,觸發小偷逃跑 runaway ...

委託與事件

委託與事件 一 委託 delegate 1 委託是一種可以把引用儲存為函式的型別。2 在定義了委託後,就可以宣告該委託型別的變數,接著把這個變數初始化為與委託有相同返回型別和引數類別的函式引用,之後,就可以使用委託變數呼叫這個函式,就像該變數是乙個函式一樣。如 double multiply dou...

事件與委託

1.顧客去書店訂購某種型別 計算機 的書,當書店新到某型別的書籍,會通知需要此類書的顧客。2.當顧客的需求型別發生變化時,需要通知書店。using system using system.collections.generic using system.linq using system.text ...