1. 委派的实现过程。
首先来看一下委派,委派其实就是方法的传递,并不定义方法的实现。事件其实就是标准化了的委派,为了事件处理过程特制的、稍微专业化一点的组播委派(多点委派)。下面举一个例子,我觉得把委派的例子和事件的例子比较,会比较容易理解。
** using System; **
** ** ** class Class1 **
** ** ** { **
** ** ** delegate int MathOp(int i1,int i2); **
** ** ** static void ** ** Main ** ** (string[] args) **
** ** ** { **
** MathOp op1=new MathOp(Add); **
** MathOp op2=new MathOp(Multiply); **
** Console.WriteLine(op1(100,200)); **
** ** ** Console.WriteLine(op2(100,200)); **
** Console.ReadLine(); **
** ** ** } **
** ** ** public static int Add(int i1,int i2) **
** ** ** { **
** return i1+i2; **
** ** ** } **
** ** ** public static int Multiply(int i1,int i2) **
** ** ** { **
** ** ** return i1*i2; **
** ** ** } **
** } **
首先代码定义了一个委托 MathOp, 其签名匹配与两个函数 Add() 和 Multiply() 的签名 ( 也就是其带的参数类型数量相同 ):
** delegate int MathOp(int i1,int i2); ** ** **
Main() 中代码首先使用新的委托类型声明一个变量 , 并且初始化委托变量 . 注意 , 声明时的参数只要使用委托传递的函数的函数名 , 而不加括号 :
** MathOp op1=new MathOp(Add); **
** ( ** ** 或为 ** ** MathOp op1=new MathOp(Multiply);) ** ** **
委托传递的函数的函数体 :
** public static int Add(int i1,int i2) ** ** **
** { **
** return i1+i2; **
** } **
** public static int Multiply(int i1,int i2) **
** { **
** return i1*i2; **
** } **
然后把委托变量看作是一个函数名 , 将参数传递给函数。 ** Console.WriteLine(op1(100,200)); **
** Console.WriteLine(op2(100,200)); **
2 .事件的实现过程
** using System; **
** class Class1 **
** { **
** static void ** ** Main ** ** (string[] args) **
** { **
** Student s1=new Student(); **
** Student s2=new Student(); **
** s1.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK); **
** s2.RegisterOK +=new Student.DelegateRegisterOkEvent(Student_RegisterOK); **
** s1.Register(); **
** s2.Register(); **
** Console.ReadLine(); **
** } **
** static void Student_RegisterOK() **
** { **
** Console.WriteLine("Hello"); **
** } **
** } **
** class Student **
** { **
** public delegate void DelegateRegisterOkEvent(); **
** public event DelegateRegisterOkEvent RegisterOK; **
** public string Name; **
** public void Register() **
** { **
** Console.WriteLine("Register Method"); **
** RegisterOK(); **
** } **
** } **
在 Student 类中,先声明了委托 DelegateRegisterOkEvent() ,然后使用 event 和要使用的委托类型(前面定义的 DelegateRegisterOkEvent 委托类型)声明事件 RegisterOK (可以看作是委托的一个实例。):
** public delegate void DelegateRegisterOkEvent(); **
** public event DelegateRegisterOkEvent RegisterOK; **
然后在 Main ()函数中,实例化 Student 类,然后 s1.RegisterOK 事件委托给了 Student_RegisterOK 方法。通过 “+=” (加等于)操作符非常容易地为 .Net 对象中的一个事件添加一个甚至多个响应方法;还可以通过非常简单的 “-=” (减等于)操作符取消这些响应方法。
然后,当调用 s1.Register() 时,事件 s1.RegisterOK 发生。