一些武俠小說裡的大人物,為了争奪武林盟主,号召天下,經常閉關修煉一段時間,閉關期間隻能接觸送飯的人,并且關外還有很多守衛的人員。還有,無論是籃球還是足球運動員,他們在真正接觸球之前,都必須做很長一段時間的身體素質鍛煉,像長跑之類。
如果我們想成為程式界的武林至尊,那麼我們也必須得閉關修煉,仔細修煉基本功。
那麼我們做Windows移動開發的程式員們的基本功是什麼呢?其實,基本功有很多,最重要的是邏輯思維和解決問題的能力,話又說回來,邏輯思維和解決問題的能力從何而來呢?不斷的做、練,熟能生巧在程式界内是最能得到展現的了。
我們這些Windows移動開發的“屌絲們”該做、練些什麼呢?我是用C#做Windows移動開發的,是以我所用的武器是C#,所有的招數也都是C#打出來的,在閉關這個環節,我主要修煉委托、繼承、多态、垃圾回收以及泛型,這一次,我主要練習C#中的委托。
1.1 什麼是委托
學過C和C++的人都知道指針,當我們想把方法來作為參數來傳遞的時候,我們可以傳遞函數的指針,也就是函數的記憶體位址,這樣做會導緻類型不安全,很難控制,在C#中,為了避免這個問題,推出了委托,委托是一個特殊類型的對象,它和類應該是平級别的,也就是說,委托可以聲明在命名空間内,也可以在類内部聲明,委托也是一個記憶體位址,但它是類型安全的。
1.1.1 委托的聲明
委托和類一樣,需要提前聲明,聲明的格式:
1.1.2 委托執行個體的聲明
聲明好一個委托後,我們需要給他聲明一個方法執行個體,方法執行個體必須與委托保持簽名相同,即方法傳回值類型和委托一緻,方法參數的類型、個數、順序和委托一緻。上面委托的一個執行個體方法:
下面,我們就可以在Main函數裡面調用這個委托了,調用委托和類一樣,也必須申請一個委托對象,通過對象調用委托,如下:
1.1.3 委托對象的指派、方法的加減
一個委托對象可以同時調用多個方法,我們可以給一個委托對象添加多個執行個體方法,如下:
在Main函數中調用方法:
運作結果是-2,如果我們在方法GetAddResult内部加斷點執行,我們會發現,方法GetAddResult也被執行了。
既然委托對象可以添加方法,那麼委托對象也可以删減方法。
這回程式的運作結果就是6了。
1.1.4多點傳播委托方法受阻問題
其實,我們上面所使用的委托叫多點傳播委托,多點傳播委托會有一個問題,當多點傳播委托方法組中的前面的方法出現異常,那麼委托對象方法的疊代将會停止,後面的方法将不會被執行,怎麼處理這個問題呢?
看下面代碼:
此種方法是,委托對象通過GetInvocationList()方法傳回一個Delegate對象數組,然後周遊這個Delegate數組,進行自定義處理,這樣,前面的方法出現異常了,委托對象還會疊代方法,後面的方法就不會因前面的異常而受阻了。
1.2 為什麼要有委托
首先,委托是類型安全的,委托容易控制,效率高;另外大型應用程式中使用委托可以減少依賴性和層的耦合,為開發出更高性能的元件提供支援。
1.3 Lambda表達式
C#中有匿名方法,但是匿名方法寫起來還是不怎麼友善,是以C#3.0開始,出現了Lambda表達式,這種文法隻能用超爽兩個字來習慣,這是C#給他的程式員給開的小竈,C#的程式員們一定要為之感到慶幸。
Lambda表達式組成:(參數1,參數2..)=>{具體實作};
一切具有委托參數類型的地方,都可以使用Lambda表達式,匿名方法如果用Lambda表達式寫那應該是非常爽的一件事情。
Lambda表達式的舉例會在下面兩個常用委托中進行。
1.4 Action委托和Func委托
我們在查閱MSDN幫助文檔的時候,能夠看見很多Action<T>和Func<T>的形式存在,以前沒有見過這種結構的代碼呢?它們到底是什麼呢?
不要恐慌,他們都是委托,隻不過他們更簡單更常用而已。
1.4.1 Action委托
Action委托表示引用一個void傳回類型的方法,參數可以自定義。
如:Action<int,string,bool>表示帶三個參數傳回void委托,我們可以用Lambda表達式簡寫委托的定義和調用:
程式輸出:
System.Int32
System.String
1.4.2 Func委托
Func<T1,T2,T3>委托表示一個帶有2個參數,傳回T3類型的委托,即最後一個參數是傳回類型,前面所有參數均是參數表,看下面代碼。
委托這個知識點屬于.Net進階技術,是以對于初學者來說了解和應用起來都有點難度,越是感覺生疏,就越是閉關練習,因為這是修仙成佛的必經之路。
委托總結:

最後,給大家推薦一本覺得可以推薦一千次一萬次的書籍,這本書叫C#進階程式設計,書籍作者是美國的Christian Nagel,Bill Evjen和Jay Glynn等,中文版由李銘翻譯,為什麼推薦這本書呢?因為這本書幾乎囊括了所有.Net知識點,講解的也非常到位,現在出版到第八版,網上有第七版的中文版和第八版的英語版,看哪個版本看你的喜好了。