委托(delegate)1、可以认为是这样的对象,它包含具有相同签名和返回值类型的有序方法列表。2、可以理解为函数的一个包装,它使得C#中的函数可以作为参数来被传递。
委托的定义和方法的定义类似,只是在定义的前面多一个delegate关键字。
public delegate void MyDelegate( int para1, string para2);//包装public void MyMethod(int a, string b); //返回类型相同,参数个数,顺序和类型相同。
- 方法的签名 必须 与 委托 一致,方法签名包括参数的个数、类型和顺序。
- 方法的返回类型要和 委托 一致,注意,方法的返回类型不属于方法签名的一部分。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 作业1 { class Program { //1.使用delegate定义一个委托类型 delegate void MyDelegate(int para1, int para2); static void Main(string[] args) { //2.声明委托变量d MyDelegate d; //3.实例化委托类型,传递的方法也可以为静态方法,这里传递的是实例方法 d=new MyDelegate(new Program().Add); //4.委托类型作为参数传递给另一个方法 MyMethod(d); Console.ReadKey(); } //该方法的定义必须与委托定义相同,即返回类型为void,两个int类型的参数 void Add(int para1,int para2) { int sum = para1 + para2; Console.WriteLine("两个值的和为:"+sum); } //方法的参数是委托类型 private static void MyMethod(MyDelegate mydelegate) { //5. 在方法中调用委托 mydelegate(1, 2); } } }
委拖链
委托链其实就是委托类型,只是委托链把多个委托链接在一起而已,也就是说,我们把链接了多个方法的委托称为委托链或多路广播委托。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 作业1 8 { 9 class Program 10 { 11 public delegate void DelegateTest(); 12 static void Main(string[] args) 13 { 14 15 //用静态方法实例化委托 16 DelegateTest dtDelegate = new DelegateTest(Program.method1); 17 18 //用实例方法 19 DelegateTest deDelegate1 = new DelegateTest(new Program().method2); 20 21 //定义一个委托对象,一开始指定为空,即不代表什么方法 22 DelegateTest delegateChain = null; 23 24 //使用+符号链接委拖 -符号移除委托 25 delegateChain += dtDelegate; 26 delegateChain += deDelegate1; 27 delegateChain += deDelegate1; 28 delegateChain += dtDelegate; 29 delegateChain-= dtDelegate; 30 delegateChain(); 31 32 Console.ReadKey(); 33 } 34 35 36 //静态方法 37 private static void method1() 38 { 39 Console.WriteLine("这里是静态方法"); 40 } 41 42 private void method2() 43 { 44 Console.WriteLine("这里是实例方法"); 45 } 46 } 47 }
时间: 2024-10-12 21:23:57