C#事件机制归纳(上)

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 发生。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus