1. 程式人生 > 實用技巧 >.Net/C# -- 委託

.Net/C# -- 委託

概念

關於委託的概念呢,在網上看了好多,剛開始很懵,說法太多太亂,可能要去理解這些抽象的東西時候,需要一個接收過程吧,需要一定的時間去消化這些抽象知識。

今天在這裡我按我自己的理解去總結一下關於委託的相關基礎知識。希望對大家有所幫助,大家也不要把委託想成一個多麼複雜的概念,其實如果光理解概念的話的非常簡單。

“委託”如果翻譯成漢語意思大家都應該明白,比如:我委託張三幫我買一個棒棒糖,那麼在C#中這個張三就是一個委託,就是明明自己可以乾的事,自己偏不幹,讓一個有同樣能力的人去幹,舉幾個例子:

1:在學校裡,你是一名老師,你要找一個叫“張三”的男生,但是你不找,你讓一個認識“張三”的人去幫你找,假如這個人叫“王五”,那麼在C#中,王五就是一個委託,王五這個人很厲害,他可以找到學校裡所有男生,所以只有你找在當前學校裡的男生,都可以委託他來幫你找。同樣,如果你想找一個叫“麗麗”的女生,但是你不找,你讓一個認識“麗麗”的人去找,假如這個人叫“月月”,那麼在C#中,“月月”就是一個委託,月月這個人很厲害,他可以找到學校裡所有女生,所以只有你找在當前學校裡的女生,都可以委託她來幫你找。

2:在大山裡,一名獵戶父親,想吃野味,但是自己並不去打獵,而是讓自己的“兒子”去打獵,在C#中,這裡獵戶的“兒子”就是委託。大兒子可能只會打飛鳥,所以獵戶父親想吃飛鳥肉,就讓大兒子去,二兒子只會打走獸,所以獵戶父親想吃走獸肉,就讓二兒子去....................

3:在生活中,張三要去打官司,但是他自己不打,讓一名律師去打,在C#中,這裡的“律師”就是委託。

4:在程式中,要呼叫一個方法,但是,不直接寫“方法名”呼叫,而是先找到另一個東西,讓另一個東西去呼叫...................................

.....................................................

說白了,就是自己明明可以做的事,讓別人幫你來做,估計就有人會想,這有啥用啊,我想做一件事,明明可以直接去做,非要讓別人去做,有什麼意義呢?其實仔細想一想,自己如果直接去做,這樣雙方是有直接聯絡的,而如果讓別人來幫你做,就相當於中間插了一箇中介一樣,什麼事都有它來做,出了什麼事全由它負責,這樣原來的雙方就實現瞭解耦了。

正式進入主題:

Delegates委託:委託是一個物件,它知道如何呼叫一個方法.

委託型別和委託例項:委託型別定義了委託例項,可以呼叫的那類方法,具體來說,委託型別定義了方法的返回型別和引數,說白了,就是委託是什麼型別的,有什麼樣的引數,就可以呼叫什麼樣的方法,就好比上邊例子中的“王五”和“月月”一樣,一個只能找男生,一個只能找女生,那麼在C#中委託也是,有的委託只能找到int型別的方法,有的只能找到string型別的方法,有的可以找到string型別而且帶引數的方法。

委託的定義:delegate <型別> 委託名稱(<引數型別> 引數名稱) 比如:delegate int TestDel(int num) 這就是一個委託,這個委託很牛掰,在程式中,我們只有想呼叫int型別並且帶一個int型別引數的方法,都可以找這貨讓它去呼叫,它都能呼叫。

委託例項:把方法賦值給委託變數的時候,就建立了委託例項,比如:我們將一個int型別並且帶有引數的方法賦值給了上邊的TestDel的時候,就建立了例項,我們就可以通過這個例項來呼叫這個方法。就好比我要讓“張三”幫我買棒棒糖一樣,當張三付賬後,棒棒糖到他手裡時候,就建立了例項,我就可以從張三手裡去拿糖,在C#程式裡就是把能呼叫的方法給委託,我再從委託裡呼叫該方法。

直接來看程式碼:

一目瞭然了吧!!!!!!

在Main方法裡,我們想呼叫Square()這個方法,我們並沒有直接int result = Square(10) 而是先例項一個委託變數,再把Square()方法扔給了這個變數,再通過這個變數呼叫Square()方法!!!!!!

在這裡,呼叫者Main方法和被呼叫者Square方法它們之間進行解耦了。上方寫法是簡寫,其實完整寫法如下:

編寫外掛式的方法

方法是在執行時才賦值給委託變數的,如下:

新建一個類:

然後在main方法呼叫:

在上方程式碼中,我們把委託型別提到類的外邊了。我們新建一個Util類,裡邊有個Transform()方法,第一個引數是一個數組,第二個引數就是上邊那個委託型別的變數,裡邊的邏輯就是遍歷陣列,數組裡邊的值當做委託目標方法(Square)的引數,然後通過委託呼叫目標方法,在main方法裡,我們將原始陣列和Square()方法傳入到Transform()裡,最後將經過Square()方法處理後的數組裡邊的值,賦值給原始陣列,最後列印輸出。

這就寫出一個外掛式的方法!!

多播委託

所有都委託例項都具有多播的能力,一個委託例項可以引用一組目標方法,這個比較簡單,直接上圖:

先呼叫Square()再呼叫Square1(),呼叫的順序,和它們定義順序是一樣的。

同樣,委託可以合併,也可以移除,把+=改成 -= 就行了!

委託變數使用“加等”操作符時,其運算元可以是null,就相當於把一個新的值賦值給了委託變數;

對單個目標方法的委託變數,使用“減等”操作符時就相當於又把null值賦值給了委託變數;這裡就不上圖了;

另外:

委託是不可變的,使用加等或減等操作符時,實際上是建立了新的委託例項,並把他賦給當前的委託變數,如果多播委託的返回型別不是void,那麼呼叫者從最後一個被呼叫的方法來接收返回值,前面的方法仍然會被呼叫,但是其返回值就會被棄用了,上圖中有,這裡就不舉例了

另外:

今天暫時學這麼多!明天繼續!!!!!