菜鳥的C#學習之旅——委託
目錄
一、什麼是委託
1、委託(Delegate) 是存有對某個方法的引用的一種引用型別變數,引用可在執行時被改變。
委託(Delegate)特別用於實現事件和回撥方法,所有的委託(Delegate)都派生自 System.Delegate 類。
2、我們可以認為委託是持有一個或多個方法的物件,在正常情況下我們不會想要執行一個物件,但是委託於典型的物件不同,可以執行委託,這是委託執行它所“持有”的方法。
3、舉例:(程式碼如下)
Delegate void MyDel (int value);//宣告一個委託型別
4、我的理解是:
對某件事情我自己不能或不方便去做,就把這件事情託付給別人或別的機構去辦理,這就是委託。
二、委託概述
1、委託和類是一樣的,是一種使用者自定義的型別,但類表示的是資料和方法的集合,而委託則持有一個或多個方法,以及一系列預定義操作。
2、類和委託的比較:(如圖)
3、我們還可以將delegate看做一個包含有序方法列表的物件,這些方法具有相同的簽名和返回型別
三、宣告委託型別
1、例項程式碼:(如下)
Delegate void MyDel(int X);
(1)關鍵字:delegate
(2)返回型別:void
(3)委託型別名:MyDel
(4)簽名:int X
注意:返回型別和簽名指定了委託接受的方法形式
2、雖然委託型別宣告看上去和方法的宣告一樣,但是它不需要再類內部宣告,因為它是型別宣告。
四、建立委託物件
1、委託型別在聲明後,我們可以宣告變數並建立型別的物件,變數宣告如下:
MyDel delVar;
(1)委託型別:MyDel
(2)變數:delvar
2、建立委託物件的方式
(1)使用new運算子的物件建立表示式,程式碼如下:
delVar = new MyDel(myInstObj.MyM1);//建立委託並儲存引用
dVar = new MyDel(Sclass.OtherM2);//建立委託並儲存引用
(2)快捷語法,程式碼如下:
delVar = myInstObj.MyM1;//建立委託並儲存引用
dVar = Sclass.OtherM2;//建立委託並儲存引用
注意:這個方法和之前是一樣的,這個快捷語法能工作是因為在方法名稱和其相應的委託型別之間存在隱式轉換。
(3)建立委託的方法
//例項方法
delVar = new MyDel(myInstObj.MyM1);//建立委託並儲存引用
//靜態方法
dVar = new MyDel(Sclass.OtherM2);//建立委託並儲存引用
五、給委託賦值
1、由於委託是引用型別的,所以我們可以通過給他賦值來改變包含在委託變數中的引用。
2、具體賦值:(程式碼如下)
delVar = myInstObj.MyM1;//建立委託物件並賦值
……
dVar = Sclass.OtherM2;//建立新的委託物件並賦值
六、為委託新增方法
1、這裡主要使用+=運算子新增委託
2、具體新增方法,程式碼如下:
//老闆胡漢三
Boss huhansan = new Boss();
//看股票的同事
StockObserver tongshi1 = new StockObserver("魏關奼", huhansan);
//看NBA的同事
NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);
huhansan.Update += new EventHandler(tongshi2.CloseStockMarket);
huhansan.Update += new EventHandler(tongshi2.CloseNBADirectseeding);
//老闆回來
huhansan.SubjectState = "我胡漢三回來了!";
//發出通知
huhansan.Notify();
七、為委託移除方法
1、這裡主要使用-=運算子新增委託
2、具體新增方法,程式碼如下:
//老闆胡漢三
Boss huhansan = new Boss();
//看股票的同事
StockObserver tongshi1 = new StockObserver("魏關奼", huhansan);
//看NBA的同事
NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);
huhansan.Update -= new EventHandler(tongshi2.CloseStockMarket);
huhansan.Update -= new EventHandler(tongshi2.CloseNBADirectseeding);
//老闆回來
huhansan.SubjectState = "我胡漢三回來了!";
//發出通知
huhansan.Notify();
八、總結
就目前為止,我的總結也就僅僅知道了委託是怎麼一回事,還有很多很多的地方需要多多的實踐,這裡談不上什麼全面,只是自己學習過程中的點滴積累,還望各位大神指點一二。