委托是c#语言的一大亮点,最大的作用是让一个方法可以作为另一个方法的参数下面是一个简单的示例
internal class Program{//使用delegate定义委托类型private delegate void MyDelegate(int a, int b);private static void Main(){//声明变量,实例化委托,传递的实例方法,也可以是静态类型var d = new MyDelegate(new Program().Add);//委托作为参数传给另一个方法MyMethod(d);Console.Read();}//方法定义要与委托定义相同,返回类型void,int类型参数private void Add(int a, int b){int sum = a + b;Console.WriteLine(sum);}//方法参数是委托类型private static void MyMethod(MyDelegate myDelegate){//方法中调用委托myDelegate(1, 2);}}
再来看看委托链,多个委托链接在一起就是委托链,使用 “+”链接委托,“-”移除委托
internal class Program{public delegate void MyDelegate();private static void Main(){var d1 = new MyDelegate(Program.Method1);var d2 = new MyDelegate(new Program().Method2);//定义一个委托对象MyDelegate d = null;//“+”链接委托,“-”移除委托,如d -= d2;d += d1;d += d2;//调用委托链d();Console.Read();}private static void Method1(){Console.WriteLine("静态方法");}private void Method2(){Console.WriteLine("实例方法");}}
这时候再看官方文档 "如何合并委托(多播委托)(C# 编程指南)"就很容易理解了
// 定义委托internal delegate void CustomDel(string s);internal class TestClass{// 定义两个方法,方法定义要与委托定义相同,返回类型void,string类型参数private static void Hello(string s){Console.WriteLine($" Hello, {s}!");}private static void Goodbye(string s){Console.WriteLine($" Goodbye, {s}!");}private static void Main(){// 定义委托实例CustomDel hiDel, byeDel, multiDel, multiMinusHiDel;// 如果想要省略定义委托,可以使用Action<string>替代// 如 Action<string> hiDel, byeDel, multiDel, multiMinusHiDel;// 引用方法Hello.hiDel = Hello;// 引用方法 Goodbye.byeDel = Goodbye;//“+” 链接两个委托形成委托链(多播委托)multiDel = hiDel + byeDel;//“-” 从委托链中移除委托multiMinusHiDel = multiDel - hiDel;Console.WriteLine("Invoking delegate hiDel:");hiDel("A");Console.WriteLine("Invoking delegate byeDel:");byeDel("B");Console.WriteLine("Invoking delegate multiDel:");multiDel("C");Console.WriteLine("Invoking delegate multiMinusHiDel:");multiMinusHiDel("D");}}/* 输出:Invoking delegate hiDel:Hello, A!Invoking delegate byeDel:Goodbye, B!Invoking delegate multiDel:Hello, C!Goodbye, C!Invoking delegate multiMinusHiDel:Goodbye, D!*/
(PS:委托的本质是一个类)