先上委托的例子:
1 using System; 2 3 delegate int myDelegateHandler(int a, int b); 4 5 public class A 6 { 7 //静态方法 8 public static int M1(int a, int b) 9 { 10 return a + b; 11 } 12 } 13 14 public class Test 15 { 16 public static void Main() 17 { 18 //实例一个委托 19 myDelegateHandler tmp = new myDelegateHandler(A.M1); 20 //调用委托 21 int sum = tmp(1, 3); 22 Console.WriteLine(sum.ToString()); 23 24 } 25 }
委托的好处:提高可扩展性!
委托其实是一个类,定义了方法的类型,使得可以把方法当作另外一个方法的参数来进行传递,这样可以实现动态赋参数,有时可以避免大量分支结构(if-else),使得程序具有良好的可扩展性。说的这里,想必大家已经清楚了“委托”的含义了吧。
再举个例子:List<T>类型的Find方法的参数也是一个委托,它把“怎么去查找”或者说“怎么样才算找到”这个问题留给了开发人员。开发人员只需要定义一个参数为T,返回值为布尔型的函数,实现函数体,并将函数作为参数传给Find方法,就可以完成集合中元素的查找。
了解C++ STL的可能会联想到:sort这个函数,允许用户自定义比较函数,道理是类似的,不过C++里面并不叫委托,但是传递函数的思想是一致的。
委托链:
1 using System; 2 3 public class FuWuYuan 4 { 5 public static void BuyTicket() 6 { 7 Console.WriteLine("每次都让我去买票,囧"); 8 } 9 10 public static void BuyMovieTicket() 11 { 12 Console.WriteLine("而且还要让我带电影票,囧"); 13 } 14 } 15 16 class LaoBan 17 { 18 public delegate void BugTicketEventHandler(); 19 20 public static void Main(string[] args) 21 { 22 BugTicketEventHandler myDelegate = new BugTicketEventHandler(FuWuYuan.BuyTicket); 23 myDelegate += FuWuYuan.BuyMovieTicket; 24 myDelegate(); 25 } 26 }
其实就是让同一个人“做多件事情!”。