事件Event的解释
能够发生什么事情,用于对象或者类之间的动作协调与信息传递。
发生——响应中的5个动作
- 我有一个事件A
- 一个人或者一群人关系我这个事件
- 我这个事件发生了
- 关心我这个事件的人会被依次通知到
- 被通知到的人拿到事件信息(又称“事件数据”“事件参数”“通知”)对事件进行响应,这叫处理事件
使用场景
一般多用于左面,手机等开发的客户端,因为这些程序经常是用户通过事件来驱动的,winform开发里面的控件,按钮啊,下拉框啊,单选框等控件,都有很多事件,点击,选择,双击,改变等。用户通过这个事件来响应不同的代码。
联动解释
点击button按钮,执行A方法,在A方法里面可以获取这个点击事件的一些信息,进行处理。
这句话解释成上面的发生——响应就是
- button有一个事件click
- A方法关注了button的click事件,或许可以再来几个方法,点击button执行ABCD方法也可以
- 点击了button后,click事件就发生了
- A方法被通知到了,执行了A方法
A方法可以拿到这个 click事件的信息,进行处理,也可以不处理
事件的五个部分
事件的拥有者
- 事件
- 事件响应者
- 事件处理器
- 事件订阅
事件的使用
关于事件参数: object sender:是事件的拥有者 EventArgs e:事件参数
简单例子1
class Program
{
static void Main(string[] args)
{
//timer是事件的拥有者
Timer timer = new Timer();
timer.Interval = 1000;
//事件的订阅者
A a = new A();
B b = new B();
//A.Action是事件处理器,timer.Elapsed是每隔一段时间内执行一次的事件
//用+=符号把两个绑在一起
//A.Action的简便方法,硬写完后IDE自动提醒你生成这个方法
//Action名字随意,可以叫其他的
timer.Elapsed += a.Action;
timer.Elapsed += b.Action;
timer.Start();
Console.ReadLine();
}
}
class A
{
internal void Action(object sender, ElapsedEventArgs e)
{
Console.WriteLine("A执行了一次");
}
}
class B
{
internal void Action(object sender, ElapsedEventArgs e)
{
Console.WriteLine("B执行了一次");
}
}
简单例子2
static class Program
{
static void Main()
{
//form:事件的拥有者
//Click:事件
//a:事件的响应者
//FormClicked:事件的处理器
//this.form.Click += this.FormClicked;:事件订阅
Form form = new Form();
A a = new A(form);
form.ShowDialog();
}
}
class A
{
private Form form;
public A(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();
}
}
自定义事件
完整声明例子
class Program
{
static void Main(string[] args)
{
//一个顾客,一个服务员
Customer customer = new Customer();
Waiter waiter = new Waiter();
//事件订阅
customer.Order += waiter.Action;
//现在顾客开始点菜,点菜事件完成后,客户过得账单就更新了
customer.dian_cai();
customer.PayTheBill();
Console.ReadLine();
}
}
//服务员相当于订阅者
public class Waiter
{
public void Action(Customer customer, OrderEventArges e)
{
//订阅者可以通过事件传过来的参数获取事件信息
Console.WriteLine("我给你上菜{0}",e.Cai_Name);
//根据菜的大小,算钱
double price = 10;
switch (e.Size)
{
case "小":
price = price * 0.5;
break;
case "大":
price = price * 1.5;
break;
default:
break;
}
//算完前给顾客加上
customer.Bill += price;
}
}
//一个客人类,里面有个方法,点菜了给账单付钱
//顾客是事件拥有者,事件肯定在顾客里面啊,而且触发事件也在顾客内部触发
public class Customer
{
private OrderEventHandler orderEventHandler;
//声明一个事件,用OrderEventHandler委托类型来约束这个是事件
//里面必须写两个东西,一个添加器add,一个移除器remove
public event OrderEventHandler Order
{
add
{
this.orderEventHandler += value;
}
remove
{
this.orderEventHandler -= value;
}
}
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("我要付钱{0}", Bill);
}
//顾客做了这个操作,就触发事件
public void dian_cai()
{
if (this.orderEventHandler != null)
{
OrderEventArges e = new OrderEventArges();
e.Cai_Name = "糖醋排骨";
e.Size = "大";
this.orderEventHandler.Invoke(this,e);
}
}
}
//声明一个【点菜事件】的参数类,继承EventArgs基类。包含了参数菜名,大份小份
public class OrderEventArges : EventArgs
{
public string Cai_Name { get; set; }
public string Size { get; set; }
}
//声明一个点菜事件的委托,第一个参数是事件的拥有者顾客,第二个参数是点菜事件的参数
//为啥用EventHandler后缀,别人一看到这个后缀就知道这个委托是用来声明事件的,四个字约定俗成
public delegate void OrderEventHandler(Customer customer, OrderEventArges e);
简略声明例子
class Program
{
static void Main(string[] args)
{
//一个顾客,一个服务员
Customer customer = new Customer();
Waiter waiter = new Waiter();
//事件订阅
customer.Order += waiter.Action;
//现在顾客开始点菜,点菜事件完成后,客户过得账单就更新了
customer.dian_cai();
customer.PayTheBill();
Console.ReadLine();
}
}
//服务员相当于订阅者
public class Waiter
{
public void Action(object sender, EventArgs e)
{
//转换一个事件拥有者和事件参数
Customer customer = sender as Customer;
OrderEventArges oe = e as OrderEventArges;
//订阅者可以通过事件传过来的参数获取事件信息
Console.WriteLine("我给你上菜{0}",oe.Cai_Name);
//根据菜的大小,算钱
double price = 10;
switch (oe.Size)
{
case "小":
price = price * 0.5;
break;
case "大":
price = price * 1.5;
break;
default:
break;
}
//算完前给顾客加上
customer.Bill += price;
}
}
//一个客人类,里面有个方法,点菜了给账单付钱
//顾客是事件拥有者,事件肯定在顾客里面啊,而且触发事件也在顾客内部触发
public class Customer
{
//客户直接声明一个事件,用C#自带的EventHandler委托基类限制这个事件
public event EventHandler Order;
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("我要付钱{0}", Bill);
}
//顾客做了这个操作,就触发事件
public void dian_cai()
{
if (this.Order != null)
{
OrderEventArges e = new OrderEventArges();
e.Cai_Name = "糖醋排骨";
e.Size = "大";
this.Order.Invoke(this,e);
}
}
}
//声明一个【点菜事件】的参数类,继承EventArgs基类。包含了参数菜名,大份小份
public class OrderEventArges : EventArgs
{
public string Cai_Name { get; set; }
public string Size { get; set; }
}
//不用自己声明委托了,用C#自带的基委托
//声明一个点菜事件的委托,第一个参数是事件的拥有者顾客,第二个参数是点菜事件的参数
//为啥用EventHandler后缀,别人一看到这个后缀就知道这个委托是用来声明事件的,四个字约定俗成
//public delegate void OrderEventHandler(Customer customer, OrderEventArges e);