Windows移動開發(二)——閉關修鍊

來源:互聯網
上載者:User

標籤:style   c   int   a   get   使用   

一些武俠小說裡的大人物,為了爭奪武林盟主,號召天下,經常閉關修鍊一段時間,閉關期間只能接觸送飯的人,並且關外還有很多守衛的人員。還有,無論是籃球還是足球運動員,他們在真正接觸球之前,都必須做很長一段時間的身體素質鍛煉,像長跑之類。
如果我們想成為程式界的武林至尊,那麼我們也必須得閉關修鍊,仔細修鍊基本功。
那麼我們做Windows移動開發的程式員們的基本功是什麼呢?其實,基本功有很多,最重要的是邏輯思維和解決問題的能力,話又說回來,邏輯思維和解決問題的能力從何而來呢?不斷的做、練,熟能生巧在程式界內是最能得到體現的了。
我們這些Windows移動開發的“屌絲們”該做、練些什麼呢?我是用C#做Windows移動開發的,所以我所用的武器是C#,所有的招數也都是C#打出來的,在閉關這個環節,我主要修鍊委託、繼承、多態、記憶體回收以及泛型,這一次,我主要練習C#中的委託。
1.1 什麼是委託學過C和C++的人都知道指標,當我們想把方法來作為參數來傳遞的時候,我們可以傳遞函數的指標,也就是函數的記憶體位址,這樣做會導致類型不安全,很難控制,在C#中,為了避免這個問題,推出了委託,委託是一個特殊類型的對象,它和類應該是平層級的,也就是說,委託可以聲明在命名空間內,也可以在類內部聲明,委託也是一個記憶體位址,但它是型別安全的。  1.1.1 委託的聲明委託和類一樣,需要提前聲明,聲明的格式:delegate int DGetResult(int a,int b);  1.1.2 委託執行個體的聲明聲明好一個委託後,我們需要給他聲明一個方法執行個體,方法執行個體必須與委託保持簽名相同,即方法返回值類型和委託一致,方法參數的類型、個數、順序和委託一致。上面委託的一個執行個體方法:private int GetAddResult(int a,int b){ return a+b; }下面,我們就可以在Main函數裡面調用這個委託了,調用委託和類一樣,也必須申請一個委派物件,通過對象調用委託,如下:DGetResult getResult = GetAddResult;     //此處不需要加參數和括弧,把委派物件的地址指向方法Console.WriteLine(getResult(2,4).ToString());   //通過委派物件執行Console.ReadKey();1.1.3 委派物件的賦值、方法的加減一個委派物件可以同時調用多個方法,我們可以給一個委派物件添加多個執行個體方法,如下:int GetMinusResult(int a, int b)    //新執行個體方法 { return a - b; }在Main函數中調用方法:getResult +=GetMinusResult;Console.WriteLine(getResult(2,4).ToString()); 運行結果是-2,如果我們在方法GetAddResult內部加斷點執行,我們會發現,方法GetAddResult也被執行了。既然委派物件可以添加方法,那麼委派物件也可以刪減方法。gerResult-=GetMinusResult;Console.WriteLine(getResult(2,4).ToString()); 這回程式的運行結果就是6了。1.1.4多播委託方法受阻問題其實,我們上面所使用的委託叫多播委託,多播委託會有一個問題,當多播委託方法組中的前面的方法出現異常,那麼委派物件方法的迭代將會停止,後面的方法將不會被執行,怎麼處理這個問題呢?看下面代碼:Delegate[] del=getResult.GetInvocationList(); foreach (DGetResult _getResult in del)  {  try  {  _getResult(4,2);  }  catch(Exception)  {  Console.WriteLine("異常被引發了"); }  }此種方法是,委派物件通過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運算式簡寫委託的定義和調用:Action<int, string> action = (a, b) =>             {                 Console.WriteLine(a.GetType().ToString());                  Console.WriteLine(b.GetType().ToString());             };   //Action委託的定義             action(1,"1");  //調用委派物件程式輸出:System.Int32System.String1.4.2 Func委託Func<T1,T2,T3>委託表示一個帶有2個參數,返回T3類型的委託,即最後一個參數是傳回型別,前面所有參數均是參數表,看下面代碼。Func<int,string,bool> function=(a,b)=>             {                 Console.WriteLine(a.GetType().ToString());                 Console.WriteLine(b.GetType().ToString());                 return false;             };             function(1,"1");程式輸出:System.Int32System.String委託這個知識點屬於.Net進階技術,所以對於初學者來說理解和應用起來都有點難度,越是感覺生疏,就越是閉關練習,因為這是修仙成佛的必經之路。最後,給大家推薦一本覺得可以推薦一千次一萬次的書籍,這本書叫C#進階編程,書籍作者是美國的Christian Nagel,Bill Evjen和Jay Glynn等,中文版由李銘翻譯,為什麼推薦這本書呢?因為這本書幾乎囊括了所有.Net知識點,講解的也非常到位,現在出版到第八版,網上有第七版的中文版和第八版的英語版,看哪個版本看你的喜好了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.