c#委托与匿名委托详解

  

本来是想写一篇《委托与λ表达式的前世今生》,但仅委托部分已经写了很多内容,于是就此分开关于λ表达是的内容后续再写吧。

  

不知道λ表达式是谁发明的,只记得第一次接触λ表达式是在使用VS2008的时候,那就先认为是微软发明的吧。

  

λ表达式从我接触开始到现在变得越来越流行,Java8中开始支持,芬兰湾的科特林更是对c#, f#做了广泛的抄袭(c#曾几何时不也如此对待过Java嘛)。其实这都充分说明了,λ表达式的重要性。要搞清楚λ首先需要搞清楚委托。

  

<强>委托:

  

假设现在我们要开发一个处理两个整数的程序(假设先处理相加操作)

        公共类工   {///& lt; summary>///处理两个数///& lt;/summary>///& lt;参数name=" a "祝辞& lt;/param>///& lt;参数name=" b "祝辞& lt;/param>///& lt; returns> & lt;/returns>   公共int HandleTwoNumber (int, int b)   {   返回一个+ b;   }   }   静态void Main (string [] args)   {   int=int.Parse (Console.ReadLine ());   int b=int.Parse (Console.ReadLine ());      工=新工人();   int结果=工人。HandleTwoNumber (a, b);   Console.WriteLine(字符串。格式(“结果:{0}”,结果));      字符串p=Console.ReadLine ();   }      之前      

如果一段时间后,我们需要它变更为减操作:

        公共类工   {   公共int HandleTwoNumber (int, int b)   {   返回一个- b;   }   }      

虽然有a + b变为a - b的变化很微小,但后续此处可能面临多次变化(由减变为除.........)。有变化就应封装变化,此处我们可以将a与b的操作行为抽象出来,用什么抽象呢?委托

        公共类工   {   公众委托int TwoNumberHandleMethodDelegate (int x, int y);   公共int HandleTwoNumber (int, int b)   {   返回一个+ b;   }   }      

公共委托int TwoNumberHandleMethodDelegate (int x, int y);此处用委托标注、表明这是一个委托定义。如果去掉委托再来观察该定义,你会发现这就是一个没有方法体的抽象方法,所以委托的含义即:与该抽象方法签名形式相同的方法的类型。委托就是一种你定义的新数据类型,它与int,类是一样的都是数据类型相关性表示整数,只要是整数都可以赋值给整数型变量;TwoNumberHandleMethodDelegate则表示,接收两个int型参数并返回int型结果的这类方法,因此满足上述要求的方法都可赋值给TwoNumberHandleMethodDelegate类型的变量。

  

如此一来工人代码可修改为:
  

        公共类工   {   公众委托int TwoNumberHandleMethodDelegate (int x, int y);   公共int HandleTwoNumber (int, int b, TwoNumberHandleMethodDelegate处理)   {   返回句柄(a, b);   }   }   之前      

如此a、b的操作被封装起来,所有的变化均交由调用者来处理。此处的含义:HandleTwoNumber处理a, b两个整数,具体如何处理由处理实施。此时你可能会问,那如何来调用该方法呢?调用如下:

        私有静态int添加(int, int b)   {   返回一个+ b;   }      私有静态int子(int, int b)   {   返回一个- b;   }      静态void Main (string [] args)   {   int=int.Parse (Console.ReadLine ());   int b=int.Parse (Console.ReadLine ());   工人。TwoNumberHandleMethodDelegate方法=new Worker.TwoNumberHandleMethodDelegate(添加);   工=新工人();   int结果=工人。HandleTwoNumber(10、10、方法);//整数结果=工人。HandleTwoNumber(10、10、接头);//简化版   Console.WriteLine(字符串。格式(“结果:{0}”,结果));   }      之前      

根据上面的程序可知,主要代码块为工人的调用者,作为调用者而言应该最清楚自己想要让锅做的工作,因此作为被调用者的工人而言,它只需要接收调用者主要给的一个\ b参数及执行主要定制的算法方法,然后按照算法执行并返回结果即可。上面代码虽然简单,但其中的意义深远,随着编程时间的增加相信你的理解将越深刻。

  

委托变量在进行赋值时除了标准的方式,还可以进行简化:

        工人。TwoNumberHandleMethodDelegate方法=new Worker.TwoNumberHandleMethodDelegate(添加);   工=新工人();   int结果=工人。HandleTwoNumber(10、10、方法);//可简化为//整数结果=工人。HandleTwoNumber(10 10添加);   

c#委托与匿名委托详解