WEB开发网
开发学院软件开发C语言 Effective C# 原则22:用事件定义对外接口 阅读

Effective C# 原则22:用事件定义对外接口

 2009-02-19 08:16:32 来源:WEB开发网   
核心提示: 扩展的Logger类有一个System.ComponentModel.EventHandlerList容器,它存储了在给定系统中应该引发的事件对象,Effective C# 原则22:用事件定义对外接口(4),更新的AddMsg()方法现在带一个参数,它可以详细的指示子系统日志的消息,在C

扩展的Logger类有一个System.ComponentModel.EventHandlerList容器,它存储了在给定系统中应该引发的事件对象。更新的AddMsg()方法现在带一个参数,它可以详细的指示子系统日志的消息。如果子系统有任何的监听者,事件就被引发。同样,如果事件的监听者在所有感兴趣的消息上监听,它同样会被引发:

public class Logger
{
 private static System.ComponentModel.EventHandlerList
  Handlers = new System.ComponentModel.EventHandlerList();
 static public void AddLogger(
  string system, AddMessageEventHandler ev )
 {
  Handlers[ system ] = ev;
 }
 static public void RemoveLogger( string system )
 {
  Handlers[ system ] = null;
 }
 static public void AddMsg ( string system,
  int priority, string msg )
 {
  if ( ( system != null ) && ( system.Length > 0 ) )
  {
   AddMessageEventHandler l =
    Handlers[ system ] as AddMessageEventHandler;
   LoggerEventArgs args = new LoggerEventArgs(
    priority, msg );
   if ( l != null )
    l ( null, args );
   // The empty string means receive all messages:
   l = Handlers[ "" ] as AddMessageEventHandler;
   if ( l != null )
    l( null, args );
  }
 }
}

这个新的例子在Event HandlerList集合中存储了个别的事件句柄,客户代码添加到特殊的子系统中,而且新的事件对象被创建。然后同样的子系统需要时,取回同样的事件对象。如果你开发一个类包含有大量的事件实例,你应该考虑使用事件句柄集合。当客户附加事件句柄时,你可以选择创建事件成员。在.Net框架内部,System.Windows.Forms.Control类对事件使用了一个复杂且变向的实现,从而隐藏了复杂的事件成员字段。每一个事件字段在内部是通过访问集合来添加和移除实际的句柄。关于C#语言的这一特殊习惯,你可以在原则49中发现更多的信息。

你用事件在类上定义了一个外接的接口:任意数量的客户可以添加句柄到事件上,而且处理它们。这些对象在编译时不必知道是谁。事件系统也不必知道详细就可以合理的使用它们。在C#中事件可以减弱消息的发送者和可能的消息接受者之间的关系,发送者可以设计成与接受者无关。事件是类型把动作信息发布出去的标准方法。

上一页  1 2 3 4 

Tags:Effective 原则 事件

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接