Fork me on GitHub

.Net事件机制

              这几日太忙了,复习专业课,忙了几日其实也没认真看书,呵呵,下面再说一下事件,这个便是只要你真正理解了这个也就是委托的一种特例,是一种特殊的委托类型(也可以看作一个字段但是依旧返回的是委托类型,为什么呢,因为即便是string str ,str依旧是一个string类型 的参数),这个只要自己理解就不难了,问人根本解决不了问题和疑惑,昨日开始看时问了几个开发了几年的程序员一个问题,他们也是回答摸棱两可,最后没办法还是自己搞定了。

      由于马上要上课去了,我只能在中午画了一个思维图和写的一个Demo给大家看一下我的思路,如有不同见解可以留言以便讨论。


 
 
 示例如下:
 
using System;

namespace 事件研究
{
    //包含事件的参数类
    class WorkEventArgs : EventArgs
    {
      private  string name;
      private string position;
      public string Name
      {
          get {return name; }
      }
      public string Position
      {
          get { return position;}
      }
      public string Info
      {
          get { return ("工作人员信息");}
      }
      public WorkEventArgs(string name, string position)
      {
          this.name = name;
          this.position = position;
      }
    }
    //定义一个委托
    delegate void WorkEventHandler(object sender,WorkEventArgs e);
    //包含事件的声明和触发事件的方法的类
    class Work
    {
        private string name;
        private string position;
        public string Name
        {
            set { name = value; }
            get { return name; }
        }
        public string Position
        {
            set { position = value; }
            get { return position; }
        }
      //声明事件
       public event WorkEventHandler InfoDisplay;
        //触发事件的方法
       protected virtual void OnWork(WorkEventArgs e)
       {
           if (InfoDisplay != null)
           {
               InfoDisplay(this, e);
           }
       }
        //引发事件
       public void DisWork()
       {
           WorkEventArgs e = new WorkEventArgs("","");//参数类只是让我们使用.net提供的委托方便而已
           OnWork(e);
           if (Name != null &&position!=null )
           {
               string s = string.Format("姓名:{0}\n职位:{1}", Name, Position);
               Console.WriteLine(s);
           }
           //初始化一下事件的参数类并提取信息
            WorkEventArgs c = new WorkEventArgs(Name,position);
            Console.WriteLine("姓名:{0}\n职位:{1}", c.Name, c.Position);
         
       }
    }
    //包含事件处理方法的类
    class ResearchDepartment
    {
       //事件的处理方法
        public void DisplayInfo(object sender, WorkEventArgs e)
        {
            Console.WriteLine(e.Info);
            ((Work)sender).Name = "小明";
            ((Work)sender).Position = "部门经理";
          
        }
        public void Display(object sender, WorkEventArgs e)
        {
            Console.WriteLine("后两条为初始化一下事件的参数类并提取信息!\n");
        }
        public void BookEvent(Work worker)
        {
            worker.InfoDisplay += new WorkEventHandler(Display);
            worker.InfoDisplay += new WorkEventHandler(DisplayInfo);
        }

        void worker_InfoDisplay(object sender, WorkEventArgs e)
        {
            throw new NotImplementedException();
        }
    }
    class TestEvent
    {
        public static void Main()
        {
            //初始化发行者
            Work worker = new Work();
            //初始化订阅者
            ResearchDepartment rd = new ResearchDepartment();
            //订阅事件(即把事件的处理方法绑定到发送者的委托实例上)
            rd.BookEvent(worker);
            worker.DisWork();
            Console.ReadKey(true);
        }
    }
}
posted @ 2012-03-07 20:17  Halower  阅读(1267)  评论(3编辑  收藏  举报