事件的声明和例子
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
Customer c = new Customer();//事件拥有者
Waiter w = new Waiter();//事件响应者
c.Order += w.WaiterAction;//事件订阅,从下面的代码中可以简单的理解为:事件的拥有者调用CustomerAction方法的时候,在此方法中通过委托调用事件响应者的WaiterAction方法。
//我理解的委托就是:c#把c/c++中的方法指针进一步封装并去掉了指针的概念,然后叫做委托(一个委托就代表着一个方法)。
//那么事件存在的意义是什么呢?是为了让程序逻辑更加严密,更加安全。
c.CustomerAction();//用户点菜
c.pay();//用户付账
}
}
//点餐参数
public class OrderEventArgs:EventArgs
{
public String DishName { set; get; }//名字
public String Size { get; set; }//大分/小分
}
//声明一个委托类型,委托一个没有返回值,两个参数的方法
public delegate void OrderEventHander(Customer c,OrderEventArgs e);
//顾客
public class Customer
{
//存储事件处理器,即把事件交给哪一个方法执行
private OrderEventHander orderEventHander;
//声明事件 另外OrderEventHander用于约束委托类型,即事件处理器只能是这种类型
public event OrderEventHander Order{
add
{
this.orderEventHander += value;
}
remove
{
this.orderEventHander -= value;
}
}
public double Bill { get; set; }//账单
public void pay()
{
//付钱
Console.WriteLine("付钱:{0}",Bill);
}
//点菜动作
public void CustomerAction()
{
OrderEventArgs e = new OrderEventArgs();
e.Size = "large";
e.DishName = "cai";
orderEventHander(this,e);//触发事件
}
}
//服务生
public class Waiter
{
//服务生的事件处理器,也即用户触发点菜事件时,执行的方法
internal void WaiterAction(Customer c, OrderEventArgs e)
{
Console.WriteLine("Waiter:上菜");
double p = 10;
switch (e.Size)
{
case "small":
p *= 0.5;
break;
case "large":
p *= 1.5;
break;
default:
break;
}
c.Bill += p;
}
}
}