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. 结巴分词3--基于汉字成词能力的HMM模型识别未登录词

    作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 算法简介 在 结巴分词2--基于前缀词典及动态规划实现分词 博 ...

  2. iOS开发之Masonry框架源码深度解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

  3. App 审核由于 IPv6 网络问题被拒

    昨天 提交App Store 的时候被拒了 We discovered one or more bugs in your app when reviewed on iPhone running iOS ...

  4. Android中点击事件的实现方式

    在之前博文中多次使用了点击事件的处理实现,有朋友就问了,发现了很多按钮的点击实现,但有很多博文中使用的实现方式有都不一样,到底是怎么回事.今天我们就汇总一下点击事件的实现方式. 点击事件的实现大致分为 ...

  5. Set up VLAN (802.1q) tagging on a network interface?

    SOLUTION VERIFIED October 13 2015 KB39674 KB741413 environment Red Hat Enterprise Linux 4 Red Hat En ...

  6. SpringMVC初步

    SpringMVC框架介绍 1) Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. Spring 框架提供了构建 Web 应用程序的全功 ...

  7. 免费开源的 .NET 分布式组件库 Exceptionless Foundatio

    前言 在互联网时代,分布式应用.系统变得越来越多,我们在使用 .Net 技术构建分布式系统的时候,需要使用到一些组件或者是助手库来帮助我们提高生产力以及应用程序解耦,但是纵观.Net圈,能够符合要求的 ...

  8. .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序

    在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...

  9. [PHP源码阅读]empty和isset函数

    近日被问到PHP中empty和isset函数时怎么判断变量的,刚开始我是一脸懵逼的,因为我自己也只是一知半解,为了弄懂其真正的原理,赶紧翻开源码研究研究.经过分析可发现两个函数调用的都是同一个函数,因 ...

  10. web前端的春天 or 噩梦

    「 微信应用号可以做什么」 简单说,微信"小程序"可以为开发者提供基于微信的表单.导航.地图.媒体和位置等开发组件,让他们在微信的网页里构建一个 HTML 5 应用.同时微信还开放 ...