• 技术文章 >后端开发 >C#.Net教程

    C# 知识回顾 - 事件入门

    高洛峰高洛峰2016-11-14 13:28:21原创663
    一、What's 事件

      类或对象可以通过事件向其他类或对象通知发生的相关事情。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”(订阅者)。

      在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由按钮和列表框等控件引发的事件。可以使用集成开发环境 (IDE) 来浏览控件发布的事件,并选择想要处理的事件。 IDE 将自动添加空白事件处理程序方法和订阅该事件的代码。

    二、事件的属性汇总

    发行者确定何时引发事件;订户确定对事件作出的响应。

    一个事件可以有多个订户。订户可以处理来自多个发行者的多个事件。

    没有订户的事件永远也不会引发。

    事件通常用于表示用户操作,例如单击按钮或图形用户界面中的菜单选项。

    当事件具有多个订户时,引发该事件时默认会同步调用事件处理程序。

    事件基于 EventHandler 委托和 EventArgs 基类。

    三、事件的订阅和取消

      如果您想编写引发事件时调用的自定义代码,则可以订阅由其他类发布的事件。例如,可以订阅某个按钮的 click 事件,以使应用程序在用户单击该按钮时执行一些有用的操作。

      1.用 IDE 订阅事件

    798818-20161110170047358-574284438.png

    php入门到就业线上直播课:进入学习

    图3-1-1 新建一个 WinForm 项目

    798818-20161110170047358-574284438.png

    图3-1-2 由图1双击时所自动创建的代码

    798818-20161110170047358-574284438.png

    图3-1-3 除了图2,在 InitializeComponent 方法也自动增加了这行代码

      2.以编程方式订阅事件

      假设现在是一个新的 WinForm 程序,我们通过手动的方式自己创建事件。在 InitializeComponent 方法下面输入 this.Load +=,然后会出现提示,这时我们按下“Tab 键”,

    798818-20161110170047358-574284438.png

    图3-2-1

      会发现也会自动创建事件处理程序,效果跟上一节的直接双击空白处创建的代码可以说是一致的,代码如下:

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                this.Load += Form1_Load;
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                throw new NotImplementedException();
            }
        }

    这次,我们直接采用 lambda 方式完成事件的注册:点击空白处显示鼠标点击时的坐标。

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                //this.Load += Form1_Load;
    
                //点击事件(lambda 方式创建)
                this.Click += (s, e) =>
                {
                    MessageBox.Show($"{((MouseEventArgs)e).Location}");
                };
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                throw new NotImplementedException();
            }
        }

    【备注】内容涉及 $: (C# 6) 的语法,vs2015 以上才支持。$"{msg}" 相当于 string.Format("{0}", msg), msg 指变量。

    798818-20161110170047358-574284438.png

      3.用匿名方法订阅事件

    public Form1()
            {
                InitializeComponent();
    
                //this.Load += Form1_Load;
    
                //点击事件(lambda 方式创建)
                //this.Click += (s, e) =>
                //{
                //    MessageBox.Show($"{((MouseEventArgs)e).Location}");
                //};
    
                //使用匿名方法创建事件
                this.Click += delegate (object sender, EventArgs e)
                {
                    var mouseEventArgs = (MouseEventArgs)e;
                    var mouseLocation = mouseEventArgs.Location;
    
                    MessageBox.Show($"X: {mouseLocation.X}, Y: {mouseLocation.Y}");
                };
            }

      【注意】如果使用匿名函数订阅事件,事件的取消订阅过程将比较麻烦。这种情况下若要取消订阅,必须返回到该事件的订阅代码,将该匿名方法存储在委托变量中,然后将此委托添加到该事件中。一般来说,如果必须在后面的代码中取消订阅某个事件,则建议您不要使用匿名函数订阅此事件。

      4.取消订阅

      要防止在引发事件时调用事件处理程序,请取消订阅该事件。要防止资源泄露,应在释放订户对象之前取消订阅事件。在取消订阅事件之前,在发布对象中作为该事件的基础的多路广播委托会引用封装了订户的事件处理程序的委托。只要发布对象保持该引用,垃圾回收功能就不会删除订户对象。使用减法赋值运算符 (-=) 取消订阅事件。

    this.Load -= Form1_Load;  //使用减法赋值运算符 (-=) 取消订阅事件

      【备注】所有订户都取消订阅事件后,发行者类中的事件实例将设置为 null。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐: C#
    上一篇:C#压缩解压帮助类 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• c语言标识符有哪些类型• c语言中源文件编译后生成什么文件• c语言本身有没有输入输出语句• c语言中的标识符是由什么组成• c语言中关键字有多少个
    1/1

    PHP中文网