详解C#之事件

2020-06-04 16:00:48于海丽

所以接收者必须提供的方法必须是一下形式:

void MethodName(Object sender,NewMailEventArgs e);

3. 定义负责引发事件的方法来通知事件的登记对象

public class MailManager{
    // 定义事件成员
    public event EventHandler<NewMailEventArgs> NewMail;
    // 定义负责引发事件的方法来通知已登记的对象
    protected virtual void OnNewMail(NewMailEventArgs e){
      // 将字段复制到一个临时变量,避免多线程情况中这个成员被移除
      EventHandler<NewMailEventArgs> temp=Volatile.Read(ref NewMail);
      if(temp!=null) temp(this,e);
    }

    // 接受附加信息并调用引发事件的方法来通知所有登记的对象
    public void SimulateNewMail(string from,string to,string subject){
      NewMailEventArgs e=new NewMailEventArgs(from,to,subject);
      OnNewMail(e);
    }
  }

4. 定义事件接收者

public class Fax{
    public Fax(MailManager mm){
      // 构造委托实例,向事件登记回调方法
      mm.NewMail+=FaxMsg;
    }
    /// <summary>
    /// 回调方法
    /// </summary>
    /// <param name="sender">表示MailManager对象,便于将信息传递给他</param>
    /// <param name="e">表示MailManager对象想传给我们的附加信息</param>
    private void FaxMsg(object sender,NewMailEventArgs e){
      Console.WriteLine("msg:{0},{1},{2}",e.From,e.To,e.Subject);
    }

    /// <summary>
    /// 注销对事件的登记
    /// </summary>
    /// <param name="mm"></param>
    public void Unregister(MailManager mm){
      mm.NewMail-=FaxMsg;
    }
  }

对象不在接收事件通知时应注销对事件的关注。因为对象只要向事件等急了它的一个方法,便不能被垃圾回收。

5. 程序初始化时应首先构造MailManager对象,将指向它的变量传递给Fax。在Fax构造器中添加对事件的关注。最后调用MailManager对象的事件通知方法

static void Main(string[] args)
    {
      MailManager mm=new MailManager();
      Fax f=new Fax(mm);
      mm.SimulateNewMail("a","b","Hello World!");
      Console.ReadKey();
    }

控制台输出结果:以调用回调方法。

以上就是详解C#之事件的详细内容,更多关于C#之事件的资料请关注易采站长站其它相关文章!