C#自定义事件的步骤介绍,何时使用委托和接口

来源:互联网 发布:centos 五笔 编辑:程序博客网 时间:2024/06/06 00:50

     通常C#自定义事件有下面的几个步骤:

   1、(如果不需要发送含事件的自定义数据,请跳过此步骤,直接进入步骤 2。)在发行者类和订户类均可看见的范围中声明类,并添加保留自定义事件数据所需的成员。

C#代码  收藏代码
  1. public class 事件参数类名称EventArgs: EventArgs {
  2.   public 事件参数类名称EventArgs(...){
  3.   ...
  4.   }
  5. //一系列属性等
  6.   ...
  7. }    
 
   2、声明一个delegate: (用于事件的类型的定义)
   如:
C#代码  收藏代码
  1. public delegate void 事件名称EventHandler(object serder, EventArgs e);     
 

//事件名称用你的自己的来代替,随后的EventHandler是C#的建议命名规范,当然如果你不想遵守,可以使用任何字符甚至可以不要。

如果你想自定义事件的参数EventArgs,你可以从EventArgs这个类派生你自己的事件参数类,然后在delegate的声明中,用你的参数类替换EventArgs

注:要全面了解自定义事件的原理,你需要学习有关delegate的知识。

3、在你的类中声明一个事件,并且使用步骤2的delegate作为事件的类型

 

C#代码  收藏代码
  1. public event 事件名称EventHandler 事件名称;    
 

4、在你的类中需要触发事件的方法中,添加事件触发代码:

 

C#代码  收藏代码
  1. 事件名称(thisnew EventArgs());    

或者:

C#代码  收藏代码
  1. if(事件名称!=null)     
  2.       事件名称(thisnew EventArgs());    
 

//如果使用你自己的事件参数类,你可以用你的参数类事例替换new EventArgs(), 同时在你的参数类中保存你需要传递的数据。

5、C#自定义事件注册:

事件注册和普通的事件注册没有不同,也就是说如果一个外部的对象在你的事件被触发的时候需要作出响应,那么你可以在外部构造器中(或者适当的地方)对事件进行注册:

 

C#代码  收藏代码
  1. 带有事件的类实例.事件名称+= new 事件名称EventHandler( 事件处理方法名称);    
 

6、编写事件处理方法:

 

C#代码  收藏代码
  1. public void 事件处理方法名称(object sender, EventArgs e)     
  2. {     
  3.            //添加你的代码   
  4. }    
 

注:如果你在类中处理自己的触发事件,你可以选择C#自定义事件步骤4和5的方式,也就是注册自己,也可以在触发事件代码中直接调用事件处理方法。

参考自: http://shansun123.iteye.com/blog/665857


事件处理程序即事件处理方法。在 .NET Framework 类库中,事件是基于 EventHandler 委托和 EventArgs 基类的。+=即订阅事件,-=即取消订阅事件。例如,写在某一Text属性里面,引发事件执行,在如main等主调用代码里订阅事件,即可监控此属性的改变而执行相关的反应。具体实例代码可参加 C# EventHandler and Delegate(委托的使用) ->http://blog.csdn.net/wnln25/article/details/7197291。

在发布类中声明一个委托。

public delegate void CustomEventHandler(object sender, CustomEventArgs a);
如果没有自定义 EventArgs 类,事件类型就是非泛型 EventHandler 委托。它无需像上面这样进行声明,因为它已在 C# 项目默认包含的 System 命名空间中进行了声明。

如何:发布符合 .NET Framework 准则的事件(C# 编程指南)->http://msdn.microsoft.com/zh-cn/library/w369ty8x%28v=vs.80%29


事件、委托、委托方法的总结1(使用EventHandler<>)

-> http://hi.baidu.com/jiangyangw3r/item/e781420c40f4b3103b53ee74

事件、委托、委托方法的总结2(自定义委托)

-> http://hi.baidu.com/jiangyangw3r/item/9d8f082fc3701b99b6326371

事件、委托、委托方法的总结3(多路广播:就是一个事件可以绑定多个方法)

-> http://hi.baidu.com/jiangyangw3r/item/5884bc446bafea32fb896071



委托接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口委托方法的类的对象使用。既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?

在此,我们只讨论接口仅包含方法声明的情况,如果接口包含属性、索引器、事件等,与委托肯定有很大的作用差别。一个仅包含多个方法声明的接口与多个委托要相互替换,在很多情况下都没有技术问题,只是怎样做更合理的问题。

MSDN观点:

在以下情况中使用委托:

  • 当使用事件设计模式时。(委托是事件的基础,当需要某个事件触发外界响应时,使用委托事件比较合适。)

  • 当封装静态方法可取时。隐藏静态方法;我举个例子:new delegate(静态方法)

  • 当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。(只需访问类中的此方法。)

  • 需要方便的组合。(使用委托可以利用+=,-=方便的组合方法。)

  • 当类可能需要该方法的多个实现时。(需要一个委托完成多个事情的时候,即多路广播委托。)

在以下情况中使用接口

  • 当存在一组可能被调用的相关方法时。(依据接口的声明,可以在其内声明多个相关功能的方法。)
  • 当类只需要方法的单个实现时。(即不需要同时调用多个其他方法来处理。)
  • 当使用接口的类想要将该接口强制转换为其他接口或类类型时。(即提供QI功能。)
  • 当正在实现的方法链接到类的类型或标识时:例如比较方法。(即当针对于某一特定类作为参数或对象时。)
使用单一方法接口而不使用委托的一个很好的示例是 IComparable 或 IComparable。IComparable 声明 CompareTo 方法,该方法返回一个整数,以指定相同类型的两个对象之间的小于、等于或大于关系。IComparable 可用作排序算法的基础,虽然将委托比较方法用作排序算法的基础是有效的,但是并不理想。因为进行比较的能力属于类,而比较算法不会在运行时改变,所以单一方法接口是理想的。