经典的关于委托的详解 http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html
这里从网上找到的的实例,适合新手test下:
委托(delegate)是一种引用类型,我们在处理他的时候要当作类来看待而不是方法,说白了委托就是对方法或者方法列表的引用,调用一个委托实例就好像是调用c++中的指针一样,他封装了对制定方法的引用,或者说委托起到的是桥梁的作用,实例后的委托对象会将给定的参数传递给他所回调的方法,并去执行方法。
//声明一个委托 delegate int myDelegateHandler(int a, int b); public class A { //静态的处理方法 public static int M1(int a, int b) { int c = 0; c = a + b; return c; } } //入口类 public class B { public static void Main() { //实例一个委托 myDelegateHandler mdh = new myDelegateHandler(A.M1); //调用委托 int sum = mdh(2, 2); Console.WriteLine(sum.ToString()); } }
我们知道委托是对方法的封装,而且委托可以封装很多方法形成委托链,其实委托就好像是一个容器,他封装了我们想要实现的若干方法,当调用委托对象(相当于c++中的指针)时,就会顺序的执行它所封装的所有的方法,如果有返回值的话,往往返回的是最后一个被执行的方法的返回值,委托链的形成可以用"+="或"-="对不同的委托实例进行二元操作。
//定义一个委托 public delegate void PrintHandler(string message); public class PrintProvider1 { public void Print(string msg) { Console.WriteLine( msg + "1111111"); } public class PrintProvider2 { public void Print(string msg) { Console.WriteLine( msg + "2222222"); } class Delegate1 { public static void StaticPrint(string msg) { Console.WriteLine(msg + "3333333"); public static void Main() { string s = "委托链"; PrintProvider1 pp1 = new PrintProvider1(); PrintProvider2 pp2 = new PrintProvider2(); //创建委托实例 PrintHandler prn1 = new PrintHandler(pp1 .Print ); PrintHandler prn2 = new PrintHandler(pp2 .Print ); PrintHandler prn3 = new PrintHandler(StaticPrint ); Console.WriteLine("委托实例prn1的打印结果"); prn1(s ); Console.WriteLine("委托实例prn2的打印结果"); prn2(s); Console.WriteLine("委托实例prn1+prn2的打印结果"); PrintHandler prn = prn1 + prn2; prn(s); Console.WriteLine("委托实例prn1+prn2+prn3的打印结果"); prn += prn3; prn(s); Console.WriteLine("委托实例prn1+prn3的打印结果"); prn -= prn2; prn(s); Console.WriteLine("委托实例prn3的打印结果"); prn -= prn1; prn(s); Console.WriteLine("试图调用null委托会引发异常"); try { prn -= prn3; prn(s); } catch (NullReferenceException ex) { Console.WriteLine(ex .Message ); } Console.WriteLine("试图从null中移出委托是无效操作"); try { prn -= prn3; } catch (NullReferenceException ex) { Console.WriteLine(ex .Message ); Console.Read(); } } }
结果如下:
委托实例prn1的打印结果
委托链1111111
委托实例prn2的打印结果
委托链2222222
委托实例prn1+prn2的打印结果
委托链1111111
委托链2222222
委托实例prn1+prn2+prn3的打印结果
委托链1111111
委托链2222222
委托链3333333
委托实例prn1+prn3的打印结果
委托链1111111
委托链3333333
委托实例prn3的打印结果
委托链3333333
试图调用null委托会引发异常
未将对象引用设置到对象的实例。
试图从null中移出委托是无效操作