标签:定义 col 开始 参数类型 font 初始 运算 静态 初始化
一.什么是委托
C#中的委托可以理解为对函数的包装,它使得C#中的函数可以作为参数被传递;委托的定义与方法的定义类似,只是在定义的前面多了一个delegate关键字,如下所示:
public delegate void MyDelegate(int para1, string para2);
委托能包装的方法是有一定限制的,例如能被前面的委托类型MyDelegate包装的方法需要满足以下条件:
(1).方法的返回类型必须为void;
(2).方法必须有两个参数,并且第一个参数应为int类型,第二个参数为string类型。
归纳起来,可以被委托包装的方法必须满足以下规则:
(1).方法的签名必须与委托一致,方法签名包括参数的个数、类型和顺序;
(2).方法的返回类型要和委托一致,注意,方法的返回类型不属于方法签名的一部分。
二.委托的使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Delegate { class Program { //使用delegate关键字来定义一个委托类型 public delegate void MyDelegate(int para1, int para2); static void Main(string[] args) { //声明委托变量d MyDelegate d; //实例化委托类型 d = new MyDelegate(new Program().Add); //委托类型作为参数传递给另一个方法 MyMethod(d); Console.ReadKey(); } void Add(int para1, int para2) { int sum = para1 + para2; Console.WriteLine("两个数的和为:"+sum); } //方法的参数类型是委托类型 private static void MyMethod(MyDelegate mydelegate) { //在方法中调用委托 mydelegate(1, 2); } } }
三.委托的使用步骤
(1).定义委托类型:delegate void MyDelegate(type para1, type para2);其定义类似于方法的定义,只是多了一个delegate关键字;
(2).声明委托类型变量:MyDelegate d;既然委托是一种类型,那么可以使用委托来声明一个委托变量。
(3).实例化委托:d=new MyDelegate(obj.InstanceMethod);第二步只是声明了委托变量,但并没有将它实例化,类的实例化使用new关键字实现,而委托也属于类类型,所以委托的实例化也使用new关键字来进行,委托的实例化是用一个方法名(不能带左右括号)作为参数,并且该方法的定义必须符合委托的定义,即该方法的返回类型、参数个数和类型必须与委托定义中的一样。
(4).作为参数传递给方法:MyMethod(d);委托使得C#中,可以把一个方法作为另一个方法的参数,而委托可以看作是一个包装方法的对象。
(5).在方法中调用委托,MyMethod方法先调用委托,委托再调用方法InstanceMethod。
四.委托链的使用
C#中的委托也同样可以封装多个方法,C#中把封装多个方法的委托称作委托链或多路广播委托,且委托链中的方法的的返回值、参数类型,顺序也必须保持一致。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MultipleDelegate { class Program { //声明一个委托类型 public delegate void DelegateTest(); static void Main(string[] args) { //用静态方法来实例化委托 DelegateTest de1 = new DelegateTest(Program.method1); DelegateTest de2 = new DelegateTest(new Program().method2); //定义一个委托对象,一开始初始化为null,即不代表任何方法 DelegateTest de = null; //使用“+”符号链接委托,链接多个委托后就成了委托链 de += de1; de += de2; //调用委托链 de(); Console.ReadKey(); } //静态方法 private static void method1() { Console.WriteLine("这是静态方法"); } //实例方法 private void method2() { Console.WriteLine("这是实例方法"); } } }
五.从委托链中移除委托
既然能用“+”运算符把委托链接到一个委托对象实例上,自然也可以使用“-”运算符将某个委托从委托链对象上移除。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MultipleDelegate { class Program { //声明一个委托类型 public delegate void DelegateTest(); static void Main(string[] args) { //用静态方法来实例化委托 DelegateTest de1 = new DelegateTest(Program.method1); DelegateTest de2 = new DelegateTest(new Program().method2); //定义一个委托对象,一开始初始化为null,即不代表任何方法 DelegateTest de = null; //使用“+”符号链接委托,链接多个委托后就成了委托链 de += de1; de += de2; //使用“-”运算符把de1从委托链中移除 de -= de1; //调用委托链 de(); Console.ReadKey(); } //静态方法 private static void method1() { Console.WriteLine("这是静态方法"); } //实例方法 private void method2() { Console.WriteLine("这是实例方法"); } } }
标签:定义 col 开始 参数类型 font 初始 运算 静态 初始化
原文地址:https://www.cnblogs.com/QingYiShouJiuRen/p/11150333.html