有时我们会感到编译器自动产生的add和remove方法不够理想。如:我们需要频繁地添加或移除委托实例,同时我们又知道我们的程序是在单线程环境下运行,这时再对包含委托实例的对象进行同步访问的话就会损伤应用程序性能。

  C#编译器允许我们显式实现add和remove访问器方法。示例代码如下:

public class MailManager
{
public delegate void MailMsgEventHandler(Object sender, MailMsgEventArgs args);
//显式定义一个私有委托链表字段
  private MailMsgEventHandler mailMsgEventHandlerDelegate;
//显式定义事件及其访问器方法
public event MailMsgEventHandler MailMsg
{
//将传入的事件处理器添加到委托表上
add
{
mailMsgEventHandlerDelegate
= (MailMsgEventHandler)Delegate.Combine(mailMsgEventHandlerDelegate, value);
}
//将传入的事件处理器从委托链表上移除
remove
{
mailMsgEventHandlerDelegate
= (MailMsgEventHandler)Delegate.Remove(mailMsgEventHandlerDelegate, value);
}
}

protected virtual void OnMailMsg(MailMsgEventArgs e)
{
if(mailMsgEventHandlerDelegate != null)
{
mailMsgEventHandlerDelegate(
this, e);
}
}

public void SimulateArrivingMsg(string from, string to, string subject, string body)
{
......
}
}

  该示例中除了没有应用MethodImplAttribute特性外,其他地方和C#编译器自动产生的代码非常类似的。上述示例实现的访问器方法不再是线程安全的方法,但也意味着代码的性能有所提升。只有在我们确信只有一个线程访问事件的委托链表时,我们才应该移除MethodImplAttribute特性。

posted on 2011-03-27 21:59  辛勤的代码工  阅读(290)  评论(0编辑  收藏  举报