Effective C#原则22:用事件定义对外接口2010-12-11 博客园 Wu.Country@侠缘译可以用事件给你的类型定义一些外部接口。事件是基于委托的,因为委托可 以提供类型安全的函数签名到事件句柄上。加上大多数委托的例子都是使用事件 来说明的,以至于开发人员一开始都认为委托与事件是一回事。在原则21里,我 已经展示了一些不在事件上使用委托的例子。在你的类型与其它多个客户进行通 信时,为了完成它们的行为,你必须引发事件。一个简单的例子,你正 在做一个日志类,就像一个信息发布机一样在应用程序里发布所有的消息。它接 受所有从程序源发布的消息,并且把这些消息发布到感兴趣的听众那里。这些听 众可以是控制台,,系统日志,或者是其它的机制。就可以定义一个像下 面这样的类,当消息到达时来引发事件:public class LoggerEventArgs : EventArgs { public readonly string Message; public readonly int Priority; public LoggerEventArgs ( int p, string m ) { Priority = p; Message = m; } } // Define the signature for the event handler: public delegate void AddMessageEventHandler( object sender, LoggerEventArgs msg ); public class Logger { static Logger( ) { _theOnly = new Logger( ); } private Logger( ) { } private static Logger _theOnly = null; public Logger Singleton { get { return _theOnly; } } // Define the event: public event AddMessageEventHandler Log; // add a message, and log it. public void AddMsg ( int priority, string msg ) { // This idiom discussed below. AddMessageEventHandler l = Log; if ( l != null ) l ( null, new LoggerEventArgs( priority, msg ) ); } }