曾經對委託和事件非常頭疼,好在現在以自己的方式入門了,就行以自己的方式把它過一遍,當作學習日記吧。
委託(delegate)是一種引用型別,我們在處理他的時候要當作類來看待而不是方法,說白了委託就是對方法或者方法列表的引用,呼叫乙個委託例項就好像是呼叫c++中的指標一樣,他封裝了對制定方法的引用,或者說委託起到的是橋梁的作用,例項後的委託物件會將給定的引數傳遞給他所**的方法,並去執行方法。
看乙個簡單的例子:
//宣告乙個委託
delegate int mydelegatehandler(int a, int b);
public class a
}//入口類
public class b}
上面是乙個非常簡單的例子,具體的實現步驟:
1、 先宣告個委託例項 ;
2、然後提供要處理的方法;
3、再例項化委託(把委託看作是類的話,例項化委託就不難理解了,其引數是要處理的方法,這裡的方法 不用加括號,例項化的過程就是裝載方法的過程,就好像需要引數的建構函式一樣)例項化後的委託物件就好比是c++中的指標,它本身就是封裝了方法的物件;
4、最後我們呼叫委託物件就好比是呼叫了被封裝方法本身,呼叫時的引數也就傳給了被封裝的方法。
5、需要注意的是 所宣告的委託無論是 引數個數,引數型別,返回值型別 都要和所要封裝的方法保持一致,當呼叫委託例項物件時,所傳入的引數也要保持一致 ,否則會出現錯誤。
委託鏈
我們知道委託是對方法的封裝,而且委託可以封裝很多方法形成委託鏈,其實委託就好像是乙個容器,他封裝了我們想要實現的若干方法,當呼叫委託物件(相當於c++中的指標)時,就會順序的執行它所封裝的所有的方法,如果有返回值的話,往往返回的是最後乙個被執行的方法的返回值,委託鏈的形成可以用"+="或"-="對不同的委託例項進行二元操作。
委託鏈例項:
//定義乙個委託
public delegate void printhandler(string message);
public class printprovider1 }
public class printprovider2 }
class delegate1
public static void main()
catch (nullreferenceexception ex)
console.writeline("試圖從null中移出委託是無效操作");
trycatch (nullreferenceexception ex)
console.read(); }
}執行結果
委託例項prn1的列印結果
委託鏈1111111
委託例項prn2的列印結果
委託鏈2222222
委託例項prn1+prn2的列印結果
委託鏈1111111
委託鏈2222222
委託例項prn1+prn2+prn3的列印結果
委託鏈1111111
委託鏈2222222
委託鏈3333333
委託例項prn1+prn3的列印結果
委託鏈1111111
委託鏈3333333
委託例項prn3的列印結果
委託鏈3333333
試圖呼叫null委託會引發異常
未將物件引用設定到物件的例項。
試圖從null中移出委託是無效操作
C 學習日記 委託 事件
我個人的理解就是 委託裡放著 要傳遞的方法,乙個或者多個方法。一開始並不知道要執行什麼方法,所以把方法當做引數傳遞。委託裡的方法可以是私有的也可以是靜態的。如果委託的方法用到了外部的變數就叫做閉包。如果在foreach中每次方法傳遞每次的迭代的變數,也不會出現錯誤,因為c 5.0中自己會建立不同的變...
日記 執行緒 委託學習
好久沒有寫日記了,以前都是記下年記得,呵呵 前段時間專案忙完了,現在有些時間自己學習,提高下技術,補充能量,在下次的專案中就可以應用新學的技術來改善系統的效率 可讀性 等等。今天學習了執行緒和委託 感覺執行緒還是很有用處的,隨著接下來幾天的學習,我會把學習的收穫記錄下來,看著自己一步步的成長是一件很...
C 委託的學習
看完 這一篇文章,大致了解了委託的概念,在此進行總結 首先 滿足乙個需求,根據客戶需要用不同語言版本輸出早上好,如果用列舉 會很複雜,這裡用委託會顯得很簡潔 委託 namespace 委託實現測試 private static void chinesegreeting string name 委託的...