由于工作的需要,需要采用.net做法开发工具,在习惯了c++,转向C#的过程中,遇到了两个概念,就是委托和事件。拿一个例子来说,当在C#中,主线程中创建了一个界面,子线程中从网络上接收数据,那么要想在子线程中更新主线程的界面,这就需要用到委托了。闲话少续,在网上查阅了一些资料后,将本人对委托和事件的理解记下,和大家共勉。 1. 什么是委托
事实上,熟悉C的人肯定都对函数指针并不陌生,在c中通过函数指针可以增加程序的灵活性。比如以下的应用:
typedef void (*GreetingPtr)(string strName); //定义一个函数指针
void ChineseGreeting(string strName) //具体的两个函数
{
cout<<"早上好" <<strName.c_str()<<endl;
}
void EnglishGreeting(string strName)
{
cout<<"Good Moring" << strName.c_str()<<endl;
}
void GreetingPeople(string strName, GreetingPtr Greet) //客户端调用
{
Greet(strName);
}
int _tmain(int argc, _TCHAR* argv[])
{
GreetingPeople("小满", ChineseGreeting);
GreetingPeople("小满", EnglishGreeting);
return 0;
}
可以看出我们定义了一个函数指针,typedef void (*GreetingPtr)(string strName), 该函数指针指向返回值为空,并且有一个参数的函数,也就是我们定义的
ChineseGreeing和EnglishGreeting函数.另外我们定义了一个函数GreetIngPeople,供客户端调用,它接收两个函数,一个是字符串型参数,一个就是函数指针。这样客户端在调用的过程中,通过函数指针从而确定究竟是EnglishGreeting被执行还是ChineseGreeting被执行。这样做可以增加程序的灵活性。
介绍完了函数指针我们言归正传,说委托了,事实上委托和上面的函数指针的概念基本上是相同的,废话少说我们写一个例子,然后和上面的进行对比。
public delegate void GreetingEventHandler(string strName); //我们定义一个委托,对应着上面的函数指针
public class Programm
{
public static void GreetingPeople(string strName, GreetingEventHandler Greet)
{
Greet(strName);
}
public static ChineseGreeting(string strName)
{
Console.Writeline("早上好" + strName);
}
publics static EnglishGreeting(string strName)
{
Console.Wringline("GoodMoring " + strName);
}
static void main(string [] args)
{
GreetingPeople("小满", ChineseGreeting);
GreetingPeople("小满), EnglishGreeting);
}
}
通过上面的代码对比,我们可以看出,除了函数指针和委托的声明方式不一样,其他都是一样的。事实上委托更加灵活一些,比如我们可以进行如下的委托操作。
GreetingEventHandler g1;//定义一个委托
GreetingEventHander g2;
g1 = ChineseGreeting;
g2 = EnglishGreeting;
GreetingPeople("小满", g1);
GreetingPeople("小满", g2);
其运行结构和上面完全一样。
事实上,委托更加灵活的特点是可以给一个委托绑定多个函数,如下代码所示:
GreetingEventHandler g1;
g1 = ChineseGreeting; //赋值
g1 += EnglishGreeting;//绑定
GreetingPeople("小满", g1);//这样在执行这句话的时候,就会一次执行了ChineseGreeting和 EnglishGreeting.怎么样很神奇吧。
2 在不同的类中使用委托
事实上,上面所示的都是在同一个类中使用委托