Loading

C#中的事件

什么是事件

  • 事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些出现,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。事件是用于进程间通信。

使用事件

  • 如何定义事件
    • 使用event关键字
    访问修饰符 event 委托类型 事件名;
    
    • 订阅与取消事件(使用"+=","-=")
    //新郎官类,充当事件发布者角色
    class Bridegroom
    {
        //自定义委托
        public delegate void MarryHandler(string msg);
        //使用自定义委托类型定义事件,事件名为MarrEvent
        public  event MarryHandler MarrayEvent;
    
        //发出事件
        public void OnMarriageComing(string msg)
        {
            //判断是否绑定了事件处理方法
            if (MarrayEvent!=null)
            {
                //触发事件
                MarrayEvent(msg);
            }
        }
        static void Main(string[] args)
        {
            //初始化新郎官对象
            Bridegroom bridegroom = new Bridegroom();
    
            //实例化朋友对象
            Friend friend1 = new Friend("张三");
            Friend friend2 = new Friend("李四");
            Friend friend3 = new Friend("王五");
    
            //使用"+="订阅消息
            bridegroom.MarrayEvent += new MarryHandler(friend1.SendMessage);
            bridegroom.MarrayEvent += new MarryHandler(friend2.SendMessage);
    
            //使用"-="取消消息
            bridegroom.MarrayEvent -= new MarryHandler(friend2.SendMessage);
    
            //发出通知
            bridegroom.OnMarriageComing("到时来参见婚礼!");
            Console.ReadLine();
    
            //输出结果为
            //到时来参加婚礼!
            //张三收到了,到时候来参加
    
        }
    
        //朋友类
        public class Friend
        {
            //字段
            public string Name;
            //构造函数
            public Friend(string name )
            {
                Name = name;
            }
    
            //事件处理函数,该函数符合MarryHandler委托的定义
            public void SendMessage(string mssage)
            {
                //输出通知消息
                Console.WriteLine(mssage);
                //对事件做出处理
                Console.WriteLine(this.Name+"收到了,到时候来参加");
            }
    
        }
    }
    
    • EventHandler系统委托类
      • EventHandler系统委托类定义
      public delegate void EventHandler(Object sender,EventArgs e);
      
      • 第一个参数sender负责保存对触发事件对象的引用,其类型为Object
      • 第二个参数e负责保存事件数据,EventArgs也是.NET类库中定义的类,它不保存任何数据
    • 扩展EventArgs类
      • 因为EventHandler只用于处理不包含事件数据的事件.如果我们想要在由这种方式定义的事件中包含事件数据,则可以通过派生EventArgs类来实现
      namespace MyEvent
      {
          //自定义事件类,并使其带有事件数据
          public class MarryEventArgs:EventArgs
          {
              public string Message;
              public MarryEventArgs(string msg)
              {
                  Message = msg;
              }
          }
      
          //新郎官类,充当事件发布者角色
          class Bridegroom
          {
              //自定义委托
              public delegate void MarryHandler(object sender,MarryEventArgs e);
              //使用自定义委托类型定义事件,事件名为MarrEvent
              public event MarryHandler MarrayEvent;
      
              //发出事件
              public void OnMarriageComing(string msg)
              {
                  //判断是否绑定了事件处理方法
                  if (MarrayEvent != null)
                  {
                      //触发事件
                      MarrayEvent(this,new MarryEventArgs(msg));
                  }
              }
              static void Main(string[] args)
              {
                  //初始化新郎官对象
                  Bridegroom bridegroom = new Bridegroom();
      
                  //实例化朋友对象
                  Friend friend1 = new Friend("张三");
                  Friend friend2 = new Friend("李四");
                  Friend friend3 = new Friend("王五");
      
                  //使用"+="订阅消息
                  bridegroom.MarrayEvent += new MarryHandler(friend1.SendMessage);
                  bridegroom.MarrayEvent += new MarryHandler(friend2.SendMessage);
      
                  //使用"-="取消消息
                  bridegroom.MarrayEvent -= new MarryHandler(friend2.SendMessage);
      
                  //发出通知
                  bridegroom.OnMarriageComing("到时来参见婚礼!");
                  Console.ReadLine();
      
                  //输出结果为
                  //到时来参加婚礼!
                  //张三收到了,到时候来参加
      
              }
      
              //朋友类
              public class Friend
              {
                  //字段
                  public string Name;
                  //构造函数
                  public Friend(string name)
                  {
                      Name = name;
                  }
      
                  //事件处理函数,该函数符合MarryHandler委托的定义
                  public void SendMessage(object s,MarryEventArgs e)
                  {
                      //输出通知消息
                      Console.WriteLine(e.Message);
                      //对事件做出处理
                      Console.WriteLine(this.Name + "收到了,到时候来参加");
                  }
      
              }
          }
      }
      

事件的本质

  • C#中事件是一个特殊的多路广播委托,事件默认含有一个私有的委托变量,该变量用于保存对事件处理方法的引用,且该委托类型的变量为私有,只能从定义该事件的类中进行访问
posted @ 2019-02-10 22:03  幽默访客  阅读(1211)  评论(0编辑  收藏  举报