c# 深入理解事件1.0
Posted lxq6701
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# 深入理解事件1.0相关的知识,希望对你有一定的参考价值。
定义:Event "事件"-----能够发生什么事件
角色:使对象或类具有通知能力的成员
使用:用于对象或类间的动作协调与信息传递(消息推送)
原理:事件模型(event model)中的两个“5”
“发生--响应” 中的五个部分
- 事件的拥有者(event souse,对象)
- 事件成员(event,成员)
- 事件的响应者(event subscriber, 对象)
- 事件处理器(event handle,成员)---本质上是一个回调方法
- 事件订阅——把事件处理器与事件关联在一起,本质上是一种以委托类型为基础的“约定”
“发生--响应” 中的五个动作
- 我有一个事件
- 一群人或一个人关心我的这个事件
- 我的这个事件发生了
- 关心这个事件的人会被通知到
- 被通知到的人根据拿到的事件参数(“又称事件数据”“事件信息”“通知”)对事件进行响应(又称处理事件””)
首先简单一个Demo看下事件的使用:
namespace EventExample class Program static void Main(string[] args) // 事件五要素:事件拥有者 timer; // 事件 Elapsed // 事件响应者 Boy对象 // 事件处理器 Action方法 // 事件订阅 Timer timer = new Timer(); timer.Interval = 1000; Boy boy = new Boy(); timer.Elapsed += boy.Action; timer.Elapsed += Girl.Action; timer.Start(); Console.ReadLine(); class Boy internal void Action(object sender, ElapsedEventArgs e) Console.WriteLine("Jump!"); class Girl internal static void Action(object sender,ElapsedEventArgs e) Console.WriteLine("Singing");
事件五个部分的组成关系
(1)事件的拥有者和事件的响应者是完全不同的两个对象-
MVC\\MVP等设计模式的雏形
namespace Event1 class Program //事件拥有者 form //事件 Click //事件响应值 controller //事件处理器 FormClicked //订阅 this.form.Click += this.FormClicked; static void Main(string[] args) Form form = new Form(); Controller controller = new Controller(form); form.ShowDialog(); class Controller private Form form; public Controller(Form form) if(form!=null) this.form = form; this.form.Click += this.FormClicked; private void FormClicked(object sender, EventArgs e) this.form.Text = DateTime.Now.ToString();
(2)事件的拥有者和事件的响应者是一个对象
声明一个form对象,能否添加它的一个方法,自己处理它的click事件呢?
可以发现此时按 ctrl+“.” 已经无法出现智能提示,帮助我们自动生成事件处理器
原因:
因为form类是微软已经编写好的一个类,此时我们已经无法对它进行修改 ,解决办法是自己声明一个类去继承form类
static void Main(string[] args) MyForm form = new MyForm(); form.Click += form.FormClicked; form.ShowDialog(); class MyForm : Form internal void FormClicked(object sender, EventArgs e) this.Text = DateTime.Now.ToString();
(3)最常见的是这种,事件拥有者是事件响应者的一个字段成员,事件的响应者用自己的一个方法订阅着自己的字段成员的某个事件。
Demo:在一个窗口里有一个文本框和一个按钮,点击按钮,文本框显示“Hello World”
微软为我们准备的窗口form类进行显示的时候就是一个光板
此时若我们想为他添加按钮【即想让一个类既具有某个类的功能,又想添加新的功能,即派生(类的继承)】
//事件拥有者button
//事件 Click
//事件响应者 MyForm的对象
//事件处理器 ButtonClicked
//订阅
这个非可视化编程,只是为了理解好这个模型。
可视化编程:用vs的所见即所得的winform。手动添加事件处理器拖拉控件到窗体
右击打开代码
声明方法
namespace WindowsFormsApp2 public partial class MyForm : Form public MyForm() InitializeComponent(); this.myButton.Click += MyButton_Click; private void MyButton_Click(object sender, EventArgs e) this.myTextbox.Text = "Hello World";
自动添加事件处理器:点击button按钮 然后到属性栏,点击小,可以找到click事件,直接双击即可生成
namespace WindowsFormsApp2 public partial class MyForm : Form public MyForm() InitializeComponent(); private void MyButton_Click_1(object sender, EventArgs e) this.myTextbox.Text = "Hello World";
可以发现事件订阅不在代码中,因为在后台代码中
一个练习的Demo
namespace WindowsFormsApp1 public partial class Form1 : Form public Form1() InitializeComponent(); this.button3.Click += new EventHandler(this.ButtonClick); private void ButtonClick(object sender, EventArgs e) if(sender==button1) this.textBox1.Text = "Hello"; if (sender == button2) this.textBox1.Text = "World"; if (sender == button3) this.textBox1.Text = "Haha";
其他学习点:
事件挂接多种方式
(1)用 “+=”
this.button3.Click += this.ButtonClick;
(2)用EventHandler委托
this.button3.Click += new EventHandler(this.ButtonClick);
(3)匿名方法(已过时)
this.button3.Click += delegate (object sender, EventArgs e) this.textBox1.Text = "Mr.right"; ; //注意分号别忘了
(3) lamda
this.button3.Click += (object sender, EventArgs e) =>
this.textBox1.Text = "Me.right";
;
思考:
一个事件可不可以挂接多个事件处理器 ---可以 (第一个timer的例子)
一个事件处理器可不可以被多个事件挂接---可以 (ButtonClick处理器被多个button挂接)
以上学习了事件模型的五个组成部分及其常见的组合方式,以及如何使用厂商为我们准备好的事件。如button的click事件, timer的Elapsed事件
# 自律即是自由 #
以上是关于c# 深入理解事件1.0的主要内容,如果未能解决你的问题,请参考以下文章