.net事件机制

--------------------------------------------------------------类(包含有事件)的定义
/// <summary>
   /// 开始事件
   /// </summary>
   public class StartEventArgs:EventArgs
   {
    private int total;
    private string str_msg;
    public int Totla
    {
     get
     {
      return this.total;
     }
     set
     {
      this.total=value;
     }
    }
    public string Str_msg
    {
     get
     {
      return str_msg;
     }
     set
     {
      this.str_msg=value;
     }
    }
    public StartEventArgs(int total,string str_msg)
    {
     this.total=total;
     this.str_msg=str_msg;
    }
   }
   public delegate void StartEventHandler(object sender,StartEventArgs e);

   public event StartEventHandler StartWork;

   protected virtual void OnStarWork(StartEventArgs e)
   {
    if(StartWork!=null)
    {
     StartWork(this,e);
    }
   }
/// <summary>
   /// 批量从***添加数据库(考勤数据)
   /// </summary>
   public void DBSetLogList()
   {
    int i=0;
    ArrayList list=GetGeneralLogData();
    foreach(GeneralData g in list)
    {
     i+=1;
     StartEventArgs args1=new StartEventArgs(i,"当前第"+i.ToString()+"条数据添加到数据库...");//实例化参数
     OnStar(args1);//向外部发出通知
     DBSetGereralData(g);
    }
    StartEventArgs args2=new StartEventArgs(i,"考勤数据回收完成!");
    OnStar(args2);
   }



---------------------------------------------------事件与处理程序的挂接
/// <summary>
   ///  批量从考勤机添加数据库(考勤数据)
   /// </summary>
   public void DBSetLogList()
   {
    DataAccess.GeneralDataDA da=new DataAccess.GeneralDataDA(this.finger,this.iMachinaNum);
    da.Start+=new FingerClass.DataAccess.GeneralDataDA.StartEventHandler(da_Start);
    da.DBSetLogList();
   }

------------------------------------------------------------------事件处理程序
private void da_Start(object sender, FingerClass.DataAccess.GeneralDataDA.StartEventArgs e)
   {

    StartEventArgs args=new StartEventArgs(e.Totla,e.Str_msg);//实例化参数
    OnStar(args);//向外部发出通知
   }




 .NET Framework 类库设计指南中的约定:

(1)事件委托名称应以 EventHandler 为结尾;

(2)事件委托的“规格”应该是两个参数:第一个参数是 object 类型的 sender,代表发出事件通知的对象(代码中一般是 this 关键字(VB.NET 中是 Me))。第二个参数 e,应该是 EventArgs 类型或者从 EventArgs 继承而来的类型;

事件参数类型,应从 EventArgs 继承,名称应以 EventArgs 结尾。应该将所有想通过事件、传达到外界的信息,放在事件参数 e 中。

(3)一般的,只要类不是密封(C# 中的 sealed,VB.NET 中的 NotInheritable)的,或者说此类可被继承,应该为每个事件提供一个 protected 并且是可重写(C# 用 virtual,VB.NET 用 Overridable)的 OnXxxx 方法:该方法名称,应该是 On 加上事件的名称;只有一个事件参数 e;一般在该方法中进行 null 判断,并且把 this/Me 作为 sender 执行事件委托;在需要发出事件通知的地方,应调用此 OnXxxx 方法。

对于此类的子类,如果要改变发生此事件时的行为,应重写 OnXxxx 方法;并且在重写时,一般情况下应调用基类的此方法(C# 里的 base.OnXxxx,VB.NET 用 MyBase.OnXxxx)。

原文地址:https://www.cnblogs.com/kuailewangzi1212/p/607843.html