C# 代理与事件上(delegate)
C# 代理与事件共分为上下两篇,是我在学习该方面知识时记录的随笔!
文章索引:
C# 代理与事件上(delegate)
C# 代理与事件下(event)
C#代理概述
代理(delegate)是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。但它与普通的类不同的是delegate能够拥有一个签名,并且它只能持有与它的签名相匹配的方法的引用。
代理类似于C/C++ 中的函数指针极为类似,可以直接指向某一函数。但他拥有函数指针不具备的有点:
1、函数指针只能指向静态函数,但delegate既可以引用静态函数,又可以引用非静态成员函数。
2、与函数指针相比,delegate是面向对象,类型安全且受控的对象。即runtime能保证delegate指向一个有效的方法,不必要担心delegate会指向无效地址。
C++函数指针
int (* Test) (int l); //定义函数指针
//以下定义了两个处理函数,程序会根据情况调用不同的过程
int Add(int t)
{
return t+ t;
}
int Mut(int t)
{
return t*t;
}
//把函数做参数
int test2(int t,int (* p) (int ))
{
return p(t);
}
int main(int argc, char* argv[])
{
char input[8];
printf("Please Input a Number!\n");
scanf("%s",input);
int t = atoi(input);
int p;
//大于10,此指针指向Add()
if(t > 10)
Test = Add;
//小于10,此指针指向Mut()
else
Test = Mut;
//通过指针调用
p = Test(t);
printf("The Result is %d",p);
if(t > 10)
p = test2(t,Add);
//小于10,此指针指向Mut()
else
p = test2(t,Mut);
return 0;
}
代码中 p = test2(t,Add)和 p = test2(t,Mut)与delegate极为相似。
C# delegate
//声明一个代理的例子:
public delegate int MyDelegate(int t);
class program
{
//我们与传递的方法,方法的参数和返回类型必须和申明的代理相同
private static int Add(int t)
{
return t+t;
}
private static int Mul(int t)
{
return t*t;
}
private int Operation(int t,MyDelegate OperationDelegate)
{
OperationDelegate(t);
}
static void Main(string[] args)
{
Operation(10,Add);
Operation(10,Mul);
}
}
将方法绑定到委托
public delegate int MyDelegate(int t);
class program
{
//我们与传递的方法,方法的参数和返回类型必须和申明的代理相同
private static int Add(int t)
{
return t+t;
}
private static int Mul(int t)
{
return t*t;
}
private int Operation(int t,MyDelegate OperationDelegate)
{
OperationDelegate(t);
}
static void Main(string[] args)
{
MyDelegate delegate1,delegate2;
delegate1=Add;
delegate2=Mul;
Operation(10,delegate1);
Operation(10,delegate2);
//绑定多个方法
MyDelegate delegate3;
delegate3=Add;//绑定第一个方法,此为赋值语句,第一次不能使用“+=”
delegate3+=Mul;//绑定另一个方法 ,此为绑定语句
Operation(10,delegate3); //取消某个绑定
delegate3-=Mul;//取消第二个绑定
Operation(10,delegate3);
}
}
总结
1、委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,同时使得程序具有更好的可扩展性。
2、使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
参考
1、C# 中的委托和事件(Jimmy Zhang )
浙公网安备 33010602011771号