C#[.NET] C# 知识回顾 – 事件入门

一、What’s 事件

  类或对象可以透过事件向此外类或对象发出通报。

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

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

 

  在过去的支付中,经典的
WinForm 和 WebForm 是都经过事件驱动来反映他们的兵不血刃之处。通过
IDE,轻松订阅按钮和有些输入控件引发的风波,自动在类的空白点为我们添加事件处理程序的艺术和订阅该事件的代码

 

三、事件的订阅和注销

  1.用
IDE 订阅事件

C# 1

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

C# 2

图3-1-2 由图1双击时所机关创设的代码

C# 3

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

 

  2.以编程格局订阅事件

  要是现在是一个新的
WinForm 程序,咱们透过手动的主意自己创设事件。在 InitializeComponent
方法下边输入 this.Load +=,然后会冒出提醒,这时大家按下“Tab 键”,

C# 4

 

图3-2-1

 

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

 1     public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6 
 7             this.Load += Form1_Load;
 8         }
 9 
10         private void Form1_Load(object sender, EventArgs e)
11         {
12             throw new NotImplementedException();
13         }
14     }

 

  本次,大家直接运用 lambda
模式成功事件的注册:点击空白处显示鼠标点击时的坐标。

 1     public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6 
 7             //this.Load += Form1_Load;
 8 
 9             //点击事件(lambda 方式创建)
10             this.Click += (s, e) =>
11             {
12                 MessageBox.Show($"{((MouseEventArgs)e).Location}");
13             };
14         }
15 
16         private void Form1_Load(object sender, EventArgs e)
17         {
18             throw new NotImplementedException();
19         }
20     }

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

C# 5

 图3-2-2

 

  3.用匿名模式订阅事件

 1         public Form1()
 2         {
 3             InitializeComponent();
 4 
 5             //this.Load += Form1_Load;
 6 
 7             //点击事件(lambda 方式创建)
 8             //this.Click += (s, e) =>
 9             //{
10             //    MessageBox.Show($"{((MouseEventArgs)e).Location}");
11             //};
12 
13             //使用匿名方法创建事件
14             this.Click += delegate (object sender, EventArgs e)
15             {
16                 var mouseEventArgs = (MouseEventArgs)e;
17                 var mouseLocation = mouseEventArgs.Location;
18 
19                 MessageBox.Show($"X: {mouseLocation.X}, Y: {mouseLocation.Y}");
20             };
21         }

  【注意】提议不用采用匿名函数来订阅事件,因为如此会直接的增多撤除订阅时的难度。除非您规定自己不会吊销订阅。

 

  4.撤废订阅

  你可以挑选择消订阅事件,来防护触发对应的事件处理程序。你可以行使
-= 举办撤除事件的订阅。

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

 

 传送门

  《C# 知识回顾 –
系列化

  《C# 知识回顾 – 表明式树 Expression
Trees

  《C# 知识回顾 – 特性
Attribute
》、《解析
AssemblyInfo.cs – 明白常用的风味
Attribute

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

 

 


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

【参考】微软 MSDN 官方文档

 

目录

 

二、事件的性能汇总

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

  • 一个轩然大波可以被多少个类或对象开展订阅,订阅者可以轻易地挑选适合的法子进行处理。

  • 从未订阅者举行订阅的轩然大波永远也不会被触发

  • WinForm
    和 WebForm 中的事件数见不鲜用来表示用户执行的某项操作。

  • 当一个事变涵盖三个订阅者时,在触发该事件的还要会默认以一头的形式调用事件处理程序。

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

 

  在此以前经过《C#
知识回顾 – 委托
delegate
》、《C#
知识回顾 – 委托 delegate
(续)
》介绍了信托的基本知识,本次我们来探视事件。

 

C# 知识回顾 – 事件入门

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

相关文章