可以认为委托是一个持有多个方法的对象,当然正常情况下你不会"执行"一个对象,但是委托和典型的类型不同。可以执行委托,这时候委托变量执行它所持有的"方法"。
/// <summary> /// 声明委托类型 /// </summary> /// <param name="value"></param> delegate void MyDel(int value); static void Main(string[] args) { // 声明委托变量 MyDel myDel; Program program = new Program(); Random random = new Random(); int randomValue = random.Next(99); if (randomValue > 50) { // 给委托变量赋值 myDel = new MyDel(program.PrintLow); } else { myDel = new MyDel(program.PrintHigh); } // 调用委托变量中的方法 myDel(randomValue); Console.ReadKey(); } // 委托最大的好处就是可以将方法当作参数传入,这样做的好处就是? void PrintLow(int value) { Console.WriteLine($"{value}长度"); } void PrintHigh(int value) { Console.WriteLine($"{value} 宽度"); }
使用委托:
1.声明委托类型
2.声明委托类型变量
3.创建委托类型的对象,把值赋值给委托变量。新委托对象包括某个方法的引用
4.为委托对象增加其他方法,方法必须满足委托相同的签名和返回类型 ,,
5.在代码中调用委托
可以把委托变量当作一个包含多个方法列表的变量
组合委托:
/// <summary> /// 声明委托类型 /// </summary> /// <param name="value"></param> delegate void MyDel(int value); static void Main(string[] args) { // 声明委托变量 MyDel myDel1, myDel2, myDel3; Program program = new Program(); Random random = new Random(); int randomValue = random.Next(99); myDel1 = program.PrintLow; myDel2 = program.PrintHigh; myDel3 = myDel1 + myDel2; // 调用委托变量中的方法 myDel3(randomValue); Console.ReadKey(); } void PrintLow(int value) { Console.WriteLine($"{value}长度"); } void PrintHigh(int value) { Console.WriteLine($"{value} 宽度"); }
打印:
54长度
54 宽度
名字看上去是想委托被改变了一样但是委托是恒定的没有被改变
为委托添加方法使用+=
为委托删除方法使用-=
使用+=和-=符号是重新创建了一个委托变量把值赋值给委托变量
示例:
/// <summary> /// 声明委托类型 /// </summary> /// <param name="value"></param> delegate void PrintFunction(); static void Main(string[] args) { Test t = new Test(); PrintFunction pf; pf = t.Print1; pf += Test.Print2; pf += t.Print1; pf += Test.Print2; if (pf != null) { pf(); } else { Console.WriteLine("委托变量是空的"); } Console.ReadKey(); } class Test { public void Print1() { Console.WriteLine("我是方法Print1"); } public static void Print2() { Console.WriteLine("我是方法Print2"); } }
打印结果:
我是方法Print1
我是方法Print2
我是方法Print1
我是方法Print2
顺序执行方法
如果委托是带有返回值的,那么它将接受最后一个方法的返回值
/// <summary> /// 声明委托类型 /// </summary> /// <param name="value"></param> delegate int AddFunction(); static void Main(string[] args) { AddFunction addFunction ; Test t = new Test(); addFunction = t.Add1; addFunction += t.Add2; int result = addFunction(); Console.WriteLine(result);//3 Console.ReadKey(); } class Test { int value = 1; public int Add1() { return value + 1; } public int Add2() { return value + 2; } }
调用带引用(ref)参数的委托,在读题部分委托列表的下一个方法时,参数值不是初始值而是传递给下一个参数。
知识点:
委托类型是引用类型,所以委托类型的变量和类变量一样保存对象的一个引用。
在创建委托类型的时候方法就有些想一个对象一样。
委托变量保存这个方法对象的引用并可以去使用他; 给委托变量重新赋值
就相当于更改了委托变量的引用