在类中,属性用来储存数据,方法用来进行逻辑运算,事件会使对象或者类具备通知能力的成员,用于对象或类间的动作协调和信息传递(消息推送)
所以说,事件在类中,和类中其它成员的地位是一致的。而区别于委托,委托和类的地位是相同的,委托也是类,是数据类型。
事件的功能 = 通知+可选事件参数(即详细信息)
事件多用于桌面,手机等开发的客户端编程,因为这些程序经常是用户通知事件来驱动(比如点击按钮等,按钮本质就是用事件模型实现的)
不同的语言实现事件模型的方法不同:C#用委托实现,Java用接口实现等等。。
MVC,MVP,MVVM等模式,是事件模式更高级更有效的玩法
我们大多使用C#提供的事件,而较少使用自定义的事件
事件模型:
1.我有一个事件
2.一个人或者一群人订阅了这个事件
3.这个事件发生了
4.订阅的人收到通知
5.响应/处理事件
上面的五条可以总结出事件模型的五个组成部分:
1.事件的拥有者(event source,对象)
2.事件成员(event,成员)
3.事件的响应者(event subscriber,对象)
4.事件处理器(event handler,成员)
5.事件订阅-一种以委托类型为基础的约定
常用的事件模型:
先来一个简单的事件例子
using System;
using System.Timers;
namespace 事件练习
{
class Program
{
static void Main(string[] args)
{
Timer timer = new Timer();//事件拥有者
timer.Interval = 1000;//.后 编辑器自动补全中:扳手:属性 方块:方法 闪电:事件
Boy boy = new Boy();//事件响应者
Girl girl = new Girl();
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 void Action(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Sing");
}
}
}
输出结果
再来试一试点击事件
using System;
using System.Windows.Forms;
namespace 事件练习2
{
class Program
{
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)
{
form.Text = DateTime.Now.ToString();
}
}
}
每次点击一下窗口,窗口上方会显示当前的时间
事件的拥有者同时也是事件的响应者,运行效果同上:
using System;
using System.Windows.Forms;
namespace 事件练习2
{
class Program
{
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();
}
}
}
带有button和text的窗体,事件的拥有者(button)是响应者form的成员
using System;
using System.Windows.Forms;
namespace 事件练习2
{
class Program
{
static void Main(string[] args)
{
MyForm form = new MyForm();
form.ShowDialog();
}
}
class MyForm : Form//派生类
{
private TextBox textBox;
private Button button;
public MyForm()
{
textBox = new TextBox();
button = new Button();
Controls.Add(button);
Controls.Add(textBox);
button.Click += buttonClicked;
button.Text = "Say Hello";
button.Top = 20;
}
private void buttonClicked(object sender, EventArgs e)
{
textBox.Text = "Hello World";
}
}
}
调整窗体的部分可以在新建项目时使用
转载:https://blog.csdn.net/akuojustdoit/article/details/116454362
查看评论