zoukankan      html  css  js  c++  java
  • 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#中事件是一个特殊的多路广播委托,事件默认含有一个私有的委托变量,该变量用于保存对事件处理方法的引用,且该委托类型的变量为私有,只能从定义该事件的类中进行访问
  • 相关阅读:
    datagridview 批量更新、日期设置、指定列弹出右键菜单
    CAD ObjectARX扩展工具的源码(二)
    ObjextARX-VS2005-字符串转换
    二叉搜索树(二叉查找树)
    贪婪算法-货物装载问题
    Messagebox.Show()常用参数的讨论
    关于矩形排样问题(三)
    单纯形法实现一维管材排料最优化
    [转载]共享一些常用的代码
    转载]取硬盘ID的API实现
  • 原文地址:https://www.cnblogs.com/youMo/p/10360411.html
Copyright © 2011-2022 走看看