理解委托与事件的好文章

author:code518 

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

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Visual Studio.NET] 的这些文章也感兴趣:

.net多语言和数据集内多数据表的处理(3)
.NET程序集浏览及分析工具(V0.1版)
针对构架师的.NET 3.0介绍
Robotics Developer Studio 2008 CTP Available for Download
SCSF 系列:Smart Client Software Factory 与 ObjectBuilder
分布式缓存解决方案
强大的模板引擎开源软件NVelocity
VS2008、.NET 3.5 与 SharePoint 2007
ADO.NET入门(1)
MIX08相关技术下载链接