1.每写一个事件例子,就找出来事件模型的五个组成部分,加深对事件模型的掌握。
![](https://i-blog.csdnimg.cn/blog_migrate/11aae3aefb4414e283e75cb60dbec8f6.png)
2.通过查看 Timer 的成员,我们不难发现一个对象或者类最重要的三类成员:
属性:对象或类当前处于什么状态
方法:它能做什么
事件:它能在什么情况下通知谁
3.简单事件示例
using System;
using System.Timers;
namespace EventExample
{
class Program
{
static void Main(string[] args)
{
// 1.事件拥有者 timer
var timer = new Timer();
timer.Interval = 1000;
// 3.事件的响应者 boy
var boy = new Boy();
var girl = new Girl();
// 2.事件成员 Elapsed,5.事件订阅 +=
timer.Elapsed += boy.Action;
timer.Elapsed += girl.Action;
timer.Start();
Console.ReadLine();
}
}
class Boy
{
// 这是通过 VS 自动生成的事件处理器,适合新手上手。
// 4.事件处理器 Action
internal void Action(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Jump!");
}
}
class Girl
{
internal void Action(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Sing!");
}
}
}
4.事件详解
(1)⭐事件拥有者和事件响应者是完全不同的两个对象
![](https://i-blog.csdnimg.cn/blog_migrate/6465f6972e01a9cc2eb4781bae8ceaf2.png)
using System;
using System.Windows.Forms;
namespace EventExample
{
class Program
{
static void Main(string[] args)
{
// 1.事件拥有者
var form = new Form();
// 3.事件响应者
var controller = new Controller(form);
form.ShowDialog();
}
}
class Controller
{
private Form form;
public Controller(Form form)
{
if (form != null)
{
this.form = form;
// 2.事件成员 Click 5.事件订阅 +=
this.form.Click += this.FormClicked;
}
}
// 4.事件处理器
private void FormClicked(object sender, EventArgs e)
{
this.form.Text = DateTime.Now.ToString();
}
}
}
(2)⭐⭐事件的拥有者和响应者是同一个对象
![](https://i-blog.csdnimg.cn/blog_migrate/e3139e2b245ef6e1ad8d9a8fa8d0a532.png)
using System;
using System.Windows.Forms;
namespace EventExample
{
class Program
{
static void Main(string[] args)
{
// 1.事件拥有者 3.事件响应者 都是 from
var form = new MyForm();
// 2.事件成员 Click 5.事件订阅 +=
form.Click += form.FormClicked;
form.ShowDialog();
}
}
// 因为无法直接修改 Form 类,所以创建了继承与 Form 类的 MyForm 类
class MyForm : Form
{
// 4.事件处理器
internal void FormClicked(object sender, EventArgs e)
{
this.Text = DateTime.Now.ToString();
}
}
}
(3)⭐⭐⭐事件的拥有者是事件响应者的一个字段成员(事件拥有者使用自己的方法订阅自己字段成员的事件)
![](https://i-blog.csdnimg.cn/blog_migrate/ba7f237d5f359ee658c36a63d5c7fc20.png)
using System;
using System.Windows.Forms;
namespace EventExample
{
class Program
{
static void Main(string[] args)
{
// 3.事件响应者 form
var form = new MyForm();
form.ShowDialog();
}
}
class MyForm : Form
{
private TextBox textBox;
// 1.事件拥有者 button
private Button button;
public MyForm()
{
this.textBox = new TextBox();
this.button = new Button();
this.Controls.Add(this.button);
this.Controls.Add(this.textBox);
// 2.事件成员 Click 5.事件订阅 +=
this.button.Click += this.ButtonClicked;
this.button.Top = 100;
}
// 4.事件处理器
private void ButtonClicked(object sender, EventArgs e)
{
this.textBox.Text = "Hello, World!!!!";
}
}
}
5.事件的声明
事件声明有完整声明和简略声明两种,简略声明是完整声明的语法糖。
(1)事件的完整声明
using System;
using System.Threading;
namespace EventExample
{
class Program
{
static void Main(string[] args)
{
// 1.事件拥有者
var customer = new Customer();
// 2.事件响应者
var waiter = new Waiter();
// 3.Order 事件成员 5. +=事件订阅
customer.Order += waiter.Action;
customer.Action();
customer.PayTheBill();
}
}
// 该类用于传递点的是什么菜,作为事件参数,需要以 EventArgs 结尾,且继承自 EventArgs
public class OrderEventArgs:EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
// 声明一个委托类型,因为该委托用于事件处理,所以以 EventHandler 结尾
// 注意委托类型的声明和类声明是平级的
public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);
public class Customer
{
// 委托类型字段
private OrderEventHandler orderEventHandler;
// 事件声明
public event OrderEventHandler Order
{
add { this.orderEventHandler += value; }
remove { this.orderEventHandler -= value; }
}
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("I will pay ${0}.",this.Bill);
}
public void WalkIn()
{
Console.WriteLine("Walk into the restaurant");
}
public void SitDown()
{
Console.WriteLine("Sit down.");
}
public void Think()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Let me think ...");
Thread.Sleep(1000);
}
if (this.orderEventHandler != null)
{
var e = new OrderEventArgs();
e.DishName = "Kongpao Chicken";
e.Size = "large";
this.orderEventHandler.Invoke(this,e);
}
}
public void Action()
{
Console.ReadLine();
this.WalkIn();
this.SitDown();
this.Think();
}
}
public class Waiter
{
// 4.事件处理器
public void Action(Customer customer, OrderEventArgs e)
{
Console.WriteLine("I will serve you the dish - {0}.",e.DishName);
double price = 10;
switch (e.Size)
{
case "small":
price *= 0.5;
break;
case "large":
price *= 1.5;
break;
default:
break;
}
customer.Bill += price;
}
}
}
(2)事件的简略声明
using System;
using System.Threading;
namespace EventExample
{
class Program
{
static void Main(string[] args)
{
// 1.事件拥有者
var customer = new Customer();
// 2.事件响应者
var waiter = new Waiter();
// 3.Order 事件成员 5. +=事件订阅
customer.Order += waiter.Action;
customer.Action();
customer.PayTheBill();
}
}
public class OrderEventArgs:EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);
public class Customer
{
// 简略事件声明,看上去像一个委托(delegate)类型字段
public event OrderEventHandler Order;
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("I will pay ${0}.",this.Bill);
}
public void WalkIn()
{
Console.WriteLine("Walk into the restaurant");
}
public void SitDown()
{
Console.WriteLine("Sit down.");
}
public void Think()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Let me think ...");
Thread.Sleep(1000);
}
if (this.Order != null)
{
var e = new OrderEventArgs();
e.DishName = "Kongpao Chicken";
e.Size = "large";
// 事件触发
this.Order.Invoke(this,e);
}
}
public void Action()
{
Console.ReadLine();
this.WalkIn();
this.SitDown();
this.Think();
}
}
public class Waiter
{
// 4.事件处理器
public void Action(Customer customer, OrderEventArgs e)
{
Console.WriteLine("I will serve you the dish - {0}.",e.DishName);
double price = 10;
switch (e.Size)
{
case "small":
price *= 0.5;
break;
case "large":
price *= 1.5;
break;
default:
break;
}
customer.Bill += price;
}
}
}
学习用途,侵权立删;
参考文献