C# 知识回顾 - 事件入门

【博主】反骨仔    【原文】http://www.cnblogs.com/liqingwen/p/6057301.html  

序

  之前通过《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)》介绍了委托的基本知识,这次我们来看看事件。

目录

一、What's 事件

  类或对象可以通过事件向其他类或对象发出通知。

  发行者:触发(引发)事件的类或对象;

  订阅者:接收(或处理)事件的类或对象。

  在过去的开发中,经典的 WinForm 和 WebForm 是都通过事件驱动来体现他们的强大之处。通过 IDE,轻松订阅按钮和一些输入控件引发的事件,自动在类的空白处为我们添加事件处理程序的方法和订阅该事件的代码

二、事件的属性汇总

  • 发行者确定何时引发事件;订阅者决定如何对事件作出响应。

  • 一个事件可以被多个类或对象进行订阅,订阅者可以自由地选择合适的方式进行处理。

  • 没有订阅者进行订阅的事件永远也不会被触发

  • WinForm 和 WebForm 中的事件通常用来表示用户执行的某项操作。

  • 当一个事件包含多个订阅者时,在触发该事件的同时会默认以同步的形式调用事件处理程序。

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

三、事件的订阅和取消

  1.用 IDE 订阅事件

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

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

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

  2.以编程方式订阅事件

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

图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 指变量。

图3-2-2

  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;  //使用减法赋值运算符 (-=) 取消订阅事件

传送门

  《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)》


【参考】https://msdn.microsoft.com/zh-cn/library/awbftdfh(VS.80).aspx

【参考】微软 MSDN 官方文档

[.NET] C# 知识回顾 - 事件入门的更多相关文章

  1. [.NET] C# 知识回顾 - Event 事件

    C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...

  2. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  3. [C#] C# 知识回顾 - 学会处理异常

    学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...

  4. [C#] C# 知识回顾 - 学会使用异常

    学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...

  5. [C#] C# 知识回顾 - 异常介绍

    异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...

  6. C# 知识回顾 - 装箱与拆箱

    装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 生活中的装箱与拆箱    我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃> ...

  7. [C#] C# 知识回顾 - 装箱与拆箱

    装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱    我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃 ...

  8. [C#] C# 知识回顾 - Lambda

    C# 知识回顾 - Lambda 序 它是第十一个希腊字母,一个拥有失意.无奈.孤独.低调等含义的流行符号,也指示一款称为“半条命”的游戏. 不过,这次我所讲的是 C# 中的 Lambda. 目录 L ...

  9. [.NET] C# 知识回顾 - 委托 delegate (续)

    C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...

随机推荐

  1. UWP 律师查询 MVVM

    APP简介 律师查询是基于聚合数据的律师查询接口做的,这个接口目前处于停用状态,但是,由于我是之前申请的,所以,还可以用,应该是无法再申请了. 效果图 开发 一.HttpHelper 既然是请求接口的 ...

  2. 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)

           首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...

  3. Node-Webkit打包

    1.node-webkit是什么? NW.js is an app runtime based on Chromium and node.js. You can write native apps i ...

  4. Oracle Database 12c Data Redaction介绍

    什么是Data Redaction Data Redaction是Oracle Database 12c的高级安全选项之中的一个新功能,Oracle中国在介绍这个功能的时候,翻译为“数据编纂”,在EM ...

  5. [WCF]缺少一行代码引发的血案

    这是今天作项目支持的发现的一个关于WCF的问题,虽然最终我只是添加了一行代码就解决了这个问题,但是整个纠错过程是痛苦的,甚至最终发现这个问题都具有偶然性.具体来说,这是一个关于如何自动为服务接口(契约 ...

  6. 【Web动画】SVG 线条动画入门

    通常我们说的 Web 动画,包含了三大类. CSS3 动画 javascript 动画(canvas) html 动画(SVG) 个人认为 3 种动画各有优劣,实际应用中根据掌握情况作出取舍,本文讨论 ...

  7. H5坦克大战之【玩家控制坦克移动】

    自从威少砍下45+11+11的大号三双之后,网上出现了各种各样的神级段子,有一条是这样的: 威少:Hey,哥们,最近过得咋样! 浓眉:对方开启了好友验证,请先添加对方为好友 威少:...... JRS ...

  8. css居中div的几种常用方法

    在开发过程中,很多需求需要我们居中一个div,比如html文档流当中的一块div,比如弹出层内容部分这种脱离了文档流等.不同的情况有不同的居中方式,接下来就分享下一下几种常用的居中方式. 1.text ...

  9. Java中用得比较顺手的事件监听

    第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...

  10. Maven 整合FreeMarker使用

    pom.xml <!-- freemarker jar --> <dependency> <groupId>org.freemarker</groupId&g ...