一、什么是委托
委托是一种类型,就跟int,double,struct,string,class一样。它定义了一个函数的类型。现在,我们有一个方法,我们希望它的参数是某个函数,如下所示。
class A
{
void public MyFuction(自定义函数,参数1,参数2)
{
自定义函数(参数1,参数2) ;//内部逻辑,执行该函数
}
}
我们希望把某个自定义的函数作为参数,传到这个方法里面执行,请问如何实现?
所以,定义一个函数类型,它就是委托,它代表我们定义的参数的类型
public delegate void MyCustomFunc(int a,int b);
现在,参数的类型就有了,我们传一个参数值进去,这个参数值就是某个函数名称。
具体的实例
public delegate void MyCustomFunc(int a, int b);//定义一种函数的参数类型
class A
{
public void MyFuction(MyCustomFunc function, int a, int b)
{
function(a, b);//内部逻辑
}
}
class B
{
public void Test(int a, int b)//符合该参数类型的函数
{
Console.WriteLine(a + b);
}
}
class DemoClass
{
static void Main(string[] args)
{
A a =new A();
B b =new B();
a.MyFuction(b.Test,5,6);//参数类型 MyCustomFunc,参数值 Test
Console.ReadKey();
}
}
仔细体会,把函数作为参数,传到这个方法里面。所以我们执行 MyFuction方法时,也会执行function这个我们指定的函数。
委托是面向对象的、类型安全,是一种引用类型。
二、什么时候用委托
这里你可以想一下,如果你要同时执行许多函数,这些函数同时有相同的参数,相同的返回值。
比如:在ClassA中,有 public int test1 (string a, string b);
ClassB中,有public int test2 (string a, string b)
ClassC中,有 public int test3(string a, string b)
ClassD中,有public int test4 (string a, string b)
如何让这些函数同时执行?
你会这样写:
ClassA A;
classB B;
classC C;
ClassD D;
A.test1();
B.test2();
C.test3();
D.test4();
但委托
pulic delegate int myDelegate(string a,string b);
myDategate = ClassA.test1;
myDategate += ClassB.test2;
myDategate += ClassC.test3;
这样你执行myDategate (string a,string b),所有函数都会执行