1. 程式人生 > >c# 之委託 匿名函式 lamada表示式

c# 之委託 匿名函式 lamada表示式

委託:
    why use 委託?


     先給你一個需求,有一個字串陣列  List<string> li=new List<string>() {“abc” ,“DEf”,"HALDFJdfaf"}
           要求將這三個字串分別轉換成大寫,小寫,和這三個字串前後都加上雙引號。




    正常情況先我們需要宣告三個方法來實現這個需求:
     public static void strToUpper(List list){
           for (int i= 0,i<list.count(),i++){


              list[i]=list[i].ToUpper();


        }


     }


      public static void strToLower(List list){
           for (int i= 0,i<list.count(),i++){


              list[i]=list[i].ToLower();


        }


     }




       public static void strToLower(List list){
           for (int i= 0,i<list.count(),i++){


              list[i]="/"" + list[i]+"/"";


        }


     }


    三個方法定義完成,但是你會發現我們的程式碼重複率其實很高,只是方法的第三行略有變化
    這個時候我們想能否用一個方法就可以實現這個的功能呢? 
          
     
    委託:
              基本定義:


                    委託所指向的函式必須和委託具有相同的簽名(引數和返回值)


        宣告一個委託函式:注意寫的位置是在名稱空間下而不是類中


          關鍵字 :delegate
           eg:  public delegate void DelSayHi(String name);
                   有點像定義介面中的方法,沒有實現。 但是意義完全不同,因為是在類外部,
                    我們相當於自己定義了一個DelSyaHi 的型別。


             public static void test(string name,DelSayHi del){
                   //這個del就是我們需要傳入的方法
                          del(string name)
                }
   
            問題來了?委託是建立好了,但是我如何將委託與對應的方法進行繫結?


                   在關係到我在呼叫test()方法的時候,如何傳入具體的方法。
             
                    DelSayHi del =方法名  (不是字串)
                      賦值了一下
                   
                    說明函式可以轉換成委託型別。


                    直接呼叫即可 test(“jake”,方法名)


          到這一步委託的好處依然沒有體現,你會覺得這真他媽的麻煩我還不如直接呼叫舒服呢。
               
            使用匿名函式配合使用一下
                 既然是一個委託: DelSysHi del 型別
                  
                 不要去自定義方法,而是把方法直接賦給我們定義的委託
                     
                    //關鍵字別忘啦!!!!
                DelSayHi del = delegate(string name){consle.writelin("hello"+name);};
                         呼叫  del(“jake”);


               還有一種更加簡化的方法  私用lamada表示式
                      
                          DelSayHi del=(string name) => {consle.writelin("hello"+name);}




           
lamada表示式: 最簡單的的寫法: n => n>4
                   n是隨便定義的,意思是拿到一個大於4的引數


                    比如說我要刪除一個數組中大於4的所有元素
                   
                    list.RemoveAll(n=> n>4)