在做电话拨号项目中,引用了activex控件,实现中用到了委托、回调,借此机会学习下。
编程中,事件驱动再常见不过。提到事件,就会想起委托,因为事件是在委托基础上实现的。提到委托,也会想起回调函数,因为回调函数是委托更深层次的应用。
委托
委托是把你将要做的事情交给其他人去做。而怎么知道是哪个人去做呢?当然是要知道名字!而为了区别名字一样的不同人,因此,需要描述一个特征,也就是方法签名。
delegate是C#中的一种类型,实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。所实现的功能与C/C++中的函数指针十分相似。
实现一个C# delegate是很简单的,通过以下3个步骤即可实现一个delegate:
1、声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
2、创建delegate对象,并将你想要传递的函数作为参数传入。
3、在要实现异步调用的地方,通过上一步创建的对象来调用方法。
下面是一个简单的例子:
<SPAN style="FONT-SIZE: 18px">using System; public class MyDelegateTest { // 步骤1,声明delegate对象 public delegate void MyDelegate(string name); // 这是我们欲传递的方法,它与MyDelegate具有相同的参数和返回值类型 public static void MyDelegateFunc(string name) { Console.WriteLine("Hello, {0}", name); } public static void Main() { // 步骤2,创建delegate对象 MyDelegate md = new MyDelegate(MyDelegateTest.MyDelegateFunc); // 步骤3,调用delegate md("sma11"); } } </SPAN> |
输出结果是:Hello,sma11
事件
在某件事情发生时,一个对象可以通过事件通知另一个对象。比如,前台完成了前台界面,他通知你,可以把前台和你开发的程序整合了。这就是一个事件。可以看出事件是在一个时间节点去触发另外一件事情,而另外一件事情怎么去做,他不会关心。就事件来说,关键点就是什么时候,让谁去做。
C#中的事件处理实际上是一种具有特殊签名的delegate,象下面这个样子:
public delegate void MyEventHandler(object sender, MyEventArgs e);
其中的两个参数,sender代表事件发送者,e是事件参数类。MyEventArgs类用来包含与事件相关的数据,所有的事件参数类都必须从System.EventArgs类派生。当然,如果你的事件不含参数,那么可以直接用System.EventArgs类作为参数。