c# 之委托 匿名函数 lamada表达式

来源:互联网 发布:淘宝电玩巴士商城黑吗 编辑:程序博客网 时间:2024/05/29 11:09
委托:
    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)
                 


     
 
  
              




                                                        
               



阅读全文
0 0