委托本质上就是利用方法的指针进行回调,当有两个类A、 B,我们在A类中调用B类。又发现B类需要使用A类的方法。也就是当执行流程从A 执行到B后,中途又回到A执行,然后在继续在B中执行。实际的使用例子就是父窗体调用子窗体,然后子窗体又需要调用父窗体的方法。。例如:
// (一) 说明委托,用于接受方法指针,该参数应该声明与class之外,这样所有的class都能使用。
public delegate int weituo(int a, int b);
public class class_A//主执行类(被回调类)
{
public weituoweituo1;//(二)声明委托用于回调(回调与被回调类都要声明)
public int Add(int a, int b)//(三)委托指向的方法 签名必须一致(返回值,和形参)
{
return a + b;
}
public voidDo_class_B()//调用B类,再从B类执行回调
{
class_B cb = new class_B();
cb.weituo1 = this.weituo1;//(四)将委托传入B类
cb.classB_add();
}
public class_A()
{
weituo1= new weituo(this.Add);//(四)通过构造方法将回调方法注入委托
}
}
-------------------------------------------------------------------------------------
public class class_B//回调类
{
public weituoweituo1;//(二)声明委托用于回调(回调与被回调类都要声明)
public voidclassB_add()
{
Console.WriteLine( weituo1(3, 6));//执行回调
}
}
-------------------------------------------------------------------------------------
class Program
{
static void Main(string[] args)
{
class_A class_A = newclass_A();
class_A.Do_class_B();
}
}
1 首先在声明一个公共的delegate委托类型,使它能指向某类方法。
2 在回调、被回调类中都声明该委托。
3 在被回调类中用构造函数将回调方法注入委托。
4 实例化回调类后,将委托传递给回调类
5 在回调类中使用委托执行回调方法
我们可以发现委托也是通过实例化来的,例如:
call1 = newcall(math.Add);,
构造方法里的参数是被委托对象的方法。这时,委托就是这个方法的引用变量。我们可以利用这个引用将方法当作一个变量来传参。
publicvoid ppu(call d, int a, int b)//利用委托将方法(指针)当作参数传入。
{ Console.WriteLine(d(a,b));
}
在实际使用中,委托也可以实现接口的先调用后实现的功能。即先在一个类中调用委托,然后使用的时候在根据需要说明委托引用的方法。从而实现功能插入
特别强调,说明委托时,参数必须一致,输入参数和返回值都要检查。