[.NET] C# 知识回顾 - 事件入门
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# 知识回顾 - 事件入门的更多相关文章
- [.NET] C# 知识回顾 - Event 事件
C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- [C#] C# 知识回顾 - 学会处理异常
学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...
- [C#] C# 知识回顾 - 学会使用异常
学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
- C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃> ...
- [C#] C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃 ...
- [C#] C# 知识回顾 - Lambda
C# 知识回顾 - Lambda 序 它是第十一个希腊字母,一个拥有失意.无奈.孤独.低调等含义的流行符号,也指示一款称为“半条命”的游戏. 不过,这次我所讲的是 C# 中的 Lambda. 目录 L ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
随机推荐
- 旺财速啃H5框架之Bootstrap(五)
在上一篇<<旺财速啃H5框架之Bootstrap(四)>>做了基本的框架,<<旺财速啃H5框架之Bootstrap(二)>>篇里也大体认识了bootst ...
- 红黑树——算法导论(15)
1. 什么是红黑树 (1) 简介 上一篇我们介绍了基本动态集合操作时间复杂度均为O(h)的二叉搜索树.但遗憾的是,只有当二叉搜索树高度较低时,这些集合操作才会较快:即当树的高度较高(甚至一种极 ...
- Android 6.0 权限知识学习笔记
最近在项目上因为6.0运行时权限吃了亏,发现之前对运行时权限的理解不足,决定回炉重造,重新学习一下Android Permission. 进入正题: Android权限 在Android系统中,权限分 ...
- YII 2.x 模板文件的 beginBlock、beginContent、beginCache
echo '-----------beginBlock--------------------- <br />'; $this->beginBlock('block1', false ...
- 防线修建 bzoj 2300
防线修建(1s 512MB)defense [问题描述] 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上层现在还 ...
- 项目管理_FindBugs的使用
本章将讲述如何在Myeclipse下,使用FindBugs,静态分析工具,无需开发人员费劲就能找出代码中已有的缺陷. 一:Myeclipse下如何安装FindBugs插件 1:FindBugs插件下载 ...
- 让ASP.NET接受有“潜在危险”的提交
什么是有“潜在危险”的提交?马上动手写个简单的例子: 用Visual Studio创建一个空白的ASP.NET MVC程序,一切默认即可,添加一个空白的HomeController,增加一个Ind ...
- Spark笔记:复杂RDD的API的理解(下)
本篇接着谈谈那些稍微复杂的API. 1) flatMapValues:针对Pair RDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录 这个方法我最开始接 ...
- MongoDB CRUD 操作手册
基本操作 增加 在MongoDB中通过db.collection.insert()来增加新的数据. db.users.insert({username:"Jack",age:30} ...
- Egret 集成第三方库 记录
引入第三方库pureMVC 这次我们要使用到一个mvc开发框架-pureMVC,熟悉as3的朋友一定也对这个框架不陌生吧.不熟悉的也没关系,这个框架不是这次的主角.我们从 这里 下载pureMVC的T ...