大家都知道在我們一開始學習程式語言中的函式時,我們所傳入的引數統統為資料型別。所以當我們學習委託的時候難免會有些疑惑,為什麼函式傳入了乙個方法?為什麼不在內部呼叫方法?或者為什麼能夠傳入方法?現在根據我所學的內容來和大家一起解決這些問題。
人是經驗型的動物,以往的知識難免會對新所學習的知識造成影響,而且更多的時候我們容易被表象所迷惑。或許我們所看到的的內容並不就像我們所想象的那樣,深層次的挖掘或許能找到乙個統一不變的模式,解決自己的疑惑。
首先我們應該有這樣的認識,在c#中一切類,委託,資料結構都起源於同乙個類object,那麼任何型別在c#中都是或者可以轉化為乙個類,那麼委託也不例外,看下面的一句**
接下來我們到反編譯器中看一看編譯器幫我們生成了什麼
從反編譯器中我們看到了3個例項函式以及乙個建構函式,也就是說,雖然乙個委託型別的宣告只有一條語句,但是在後台,編譯器還是會以乙個類的形式維護委託。那麼我們向函式傳遞的的確是委託型別的例項,但是如果理解成傳遞的是乙個類例項或者更有好處。大家應該都知道,函式名代表著**在記憶體中存放的一塊位址,那麼用函式名來初始化委託也就順理成章了。
那麼我們看看如何例項化乙個委託的引用
我們看到了new 運算子,我們利用委託宣告一引用,並且例項化該引用,我們可以清晰的看到**與宣告乙個類例項時完全一致。
我們在反編譯器中檢視一下,雖然宣告方式不同,但是編譯器還是會在後台為我們做相同的工作。**如下:
相信大多數人又這樣一種心態,理解了乙個難懂的概念建立在我們確實的從這個概念獲益,確實的感悟到這個概念的好處。
那麼上面的一段**不應該表現出我們合理的利用了委託,我們費了很大的勁只是使用了委託,原本很簡單的一件事我們卻繞了很大的圈子。而以上**並未證明委託的優勢,相反給人一種麻煩的感覺。這樣並不能讓我們設身處地的理解學習委託。
那麼我們應該用什麼證明委託的優勢呢,我想泛型提供了乙個很好的平台。接下來我們將用排序演算法來證明委託的優勢。
氣泡排序相信大家都清楚了解,我們排序一組資料。首先比較資料,然後根據需要調換順序。問題出現了,我們對整型資料
排序首先是因為編譯器清楚的知道二者如何比較。或者說.net平台已經提供了對簡單資料型別的比較演算法。如果我們傳遞了乙個物件,編譯器就不知道該如何比較了,編譯器無法找到對類這一例項的比較演算法,如果我們並未實現該演算法時。為了實現**的從用,為了實現以某種始終如一的方式對大多數物件進行一致的處理,我們用到了泛型。泛型的出現使得委託有了乙個更廣闊的平台。充分發揮了委託的優勢。在下面的例子中將使用委託解決特定物件在乙個一致演算法中的排序問題。
首先我們構造乙個類,作為**資料的型別。新增比較演算法。使得能夠對兩個物件例項進行比較。
接下來是乙個一致的演算法,它能夠實現多種型別資料的排序工作,ilistsortarray 是乙個t型別的資料來源。其中func是乙個泛型委託,其中倆個t ,t 型別變數為輸入資料,而bool型別資料表示返回型別,它提供了函式的乙個一致的模式,即需要兩個輸入資料,提供乙個bool型別的返回值。有關更多泛型的知識可以參看以下msdn。排序演算法不需要對資料型別進行了解,也不需要知道資料的比較方式。但它提供了乙個一致的介面實現了,利用委託接受比較函式,實現了對**的隱藏,使得程式更為靈活。
在主函式中完成排序演算法,並輸出資料。在這個例子中利用委託傳遞排序方法,實現了乙個支援不同種類實現了比較方法的資料結構的氣泡排序。
委託使得我們可以在需要的地方傳入合適的**,他可以封裝某個方法,實現**靈活的呼叫。給方法傳入資料,我們可以實現對資料的合理處理。給方法傳入委託,那麼我們可以在某個片段(或者整個方法中)不關心資料的處理方式,而讓對資料的處理交給第三方。更何況很多時候我們並不知道該如何對資料進行處理。這樣從很大程度上保證了資料的隱秘性。
C 中委託與事件
c 為了型別安全,預設並不支援指標。而是採用委託的方式。委託的宣告 屬性 修飾符 delegate 返回型別 委託型別名 引數列表 其中返回型別和引數列表共同決定了委託型別能關聯的一組方法 public delegate int tdelegate int a,int b 宣告委託 在類classd...
C 基礎系列 C 中委託與事件 一
我們都知道,c 中有 介面 這個概念,所謂的 介面 就是定義一套標準,然後由實現類來具體實現其中的方法,所以說 介面,是一組類的抽象 同樣道理,我們可以將 委託 理解為 方法的抽象 也就是說定義乙個方法的模板,至於這個方法具體是怎麼樣的,就由方法自己去實現。我們知道介面的最大好處就是可以實現多型,同...
c 委託與事件 心得
c 用委託來實現事件通知機制。委託相當與c 函式指標。整個過程涉及乙個呼叫者,乙個被呼叫者,還有就是這個委託。有以下幾步 1.申明委託,2.定義呼叫者和呼叫的函式,3.定義被呼叫者和具體實現的函式 被呼叫的函式 1.申明委託 在包裡或者類裡,public public delegate void p...