首页 / 软件开发 / C# / Effective C#原则22:用事件定义对外接口
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 ) );
}
}