**事件这种成员,无论是从表层约束来讲,还是底层实践来讲,都是依赖于委托类型的。**
具体见订餐实例,出自刘铁锰老师C#课程,但课程里面有许多并不必要的代码,其作用只是为了丰富订餐这个事例,与事件声明并无关系,反而会给初学者造成困扰,本文经过对该例代码进行注释和修改之后,更有利于初学者理解完整事件声明的格式和过程,详细代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 订餐实例_10._21_
{
class Program
{
static void Main(string[] args)
{
Customer customer = new Customer();//创建事件拥有者
Waiter waiter = new Waiter();//创建时间响应者
customer.Order += waiter.Action;//事件、订阅、事件处理器
customer.ChuFa();//执行触发方法
customer.PayTheBill();//执行付账方法
}
}
public class OrderEventArgs : EventArgs//创建用于传递事件信息的累,类名需要设定为事件名+EventArgs,并且需要继承自EventArgs类(记住就行)
{
public string DishName { get; set; }
public string Size { get; set; }//创建两个属性,用于存放事件信息
}
public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);//创建委托,委托名为事件名+EventHandler
public class Customer//事件拥有者类,类的访问级别都要改为公开
{
private OrderEventHandler orderEventHandler;//使用委托类型声明一个字段,用于存储和引用事件处理器,有了字段就可以声明事件了
public event OrderEventHandler Order//声明事件,用OrderEventHandler来约束这个事件
{
add
{
this.orderEventHandler += value;//此时的value是从外界传进来的orderEventHandler字段,但不知具体类型,因此写value
}
remove
{
this.orderEventHandler -= value;
}
}
public double Bill { get; set; }//付账属性
public void PayTheBill()//付账方法
{
Console.WriteLine("I will pay ${0}.",this.Bill);
}
public void ChuFa()//设置事件的触发方法
{
if(this.orderEventHandler!=null)
{
OrderEventArgs e = new OrderEventArgs();//创建事件信息实例
e.DishName = "Kongpao Chicken";
e.Size = "large";
this.orderEventHandler.Invoke(this, e);//调用委托,触发事件
}
}
}
public class Waiter//事件响应者类
{
public void Action(Customer customer, OrderEventArgs e)//事件处理器
{
Console.WriteLine("I will serve you ths dish-{0}.",e.DishName);
double price = 10;//无论何菜,标准价格为10元
switch (e.Size)//根据菜的分量更改价格
{
case "small":
price *= 0.5;
break;
case "large":
price *= 1.5;
break;
default:
break;
}
customer.Bill += price;//将菜价加到账单属性上
}
}
}
执行结果为: