C# 知识回顾 – 事件入门

一、what’s 事件

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

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

 

二、事件的属性汇总

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

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

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

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

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

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

 

三、事件的订阅和取消

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

  1.用 IDE 订阅事件

798818-20161110170047358-574284438.png

图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。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2445793.html

(0)
上一篇 2025年3月3日 16:14:43
下一篇 2025年2月19日 20:38:59

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • C#图像处理绘制公章

    最近开始学习图像处理这一块了,学一点就记录一点,等写完也出了一个小软件了~ 这里的是:绘制公章。 #region 绘制公章        private void simpleButton_绘制公章_Click(object sender,…

    2025年3月3日
    200
  • C# GDI+ 实现橡皮筋技术

    应该有很多人都在寻找这方面的资料,看看下面我做的,或许对你会有所帮助,但愿如此。 为了实现橡皮筋技术,我用了两种方法:    第一种是利用ControlPaint.DrawReversibleLine(Point start,Point e…

    编程技术 2025年3月3日
    200
  • 子对话框的创建与销毁

    1.显示对话框 1.1显示模式对话框: CDialogDemo dlg;dlg.DoModal(); 登录后复制 1.2 显示非模式对话框: CDialogDemo *dlg=new CDialogDemo(this); dlg->C…

    编程技术 2025年3月3日
    200
  • C++静态成员与常成员的使用

    1、 实验目的 (1)学习静态成员的使用 (2)学习常成员的使用 (3)掌握静态数据成员与常数据成员的初始化 2、实验内容 (1)某商店经销一种货物,货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,因此,商店需要记录下目…

    2025年3月3日
    200
  • 用C++对C++语法格式进行分析

    前言 最近c++项目需要用到脚本,这就关系到如何绑定对象到脚本运行环境。因使用到多套脚本语言,所以现有的绑定技术,都不能满足需求。所以只能寻求解析c++的头文件,再根据描述进行绑定。起初发现boost有一套,但boost实在太臃肿了,对项目…

    编程技术 2025年3月3日
    200
  • C# 如何调用 C++ DLL中的函数接口和回调函数

    1、c#中大部分基本数据类型都和c++的基本数据类型相同,因此基本数据类型的转换比较简单,需要注意的就是字节大小。 2、c++数组和c#的数组转换需要注意的就是需要注意,需要增加声明如[marshalas(unmanagedtype.byv…

    编程技术 2025年3月3日
    200
  • c++中向任意目录下写文件

    今天遇到了在c盘的子目录下写文件出错的事情,最中自己实验后解决。小小记录一下。 代码如下: #include#include#include main(){ int data[35]; int n=35,temp; for(int i=0;…

    2025年3月3日
    200
  • C#实现一个最简单的HTTP服务器

     简介   本文用c#实现了一个最简单的http服务器类,你可以将它嵌入到自己的项目中,或者也可以阅读代码来学习关于http协议的知识。  背景   高性能的WEB应用一般都架设在强大的WEB服务器上,例如IIS, Apache, 和Tom…

    编程技术 2025年3月3日
    200
  • C# 程序员最常犯的 10 个错误

     关于C#   c#是达成微软公共语言运行库(clr)的少数语言中的一种。达成clr的语言可以受益于其带来的特性,如跨语言集成、异常处理、安全性增强、部件组合的简易模型以及调试和分析服务。作为现代的clr语言,c#是应用最为广泛的,其应用场…

    编程技术 2025年3月3日
    200
  • C#的未来计划

     在ndc london上,mads torgersen提出了对未来c#语言的的计划。需要注意的是,这些只是计划,不会保证在哪个版本发布。damien guard对这些建议进行了总结和简要的分析,我们在此为您挑选了其中的一些内容。  只读属…

    编程技术 2025年3月3日
    200

发表回复

登录后才能评论