C#事件的简略声明
声明事件的五个要素部分:
1、事件的拥有者--customer1
2、事件的响应者--Waiter1
3、事件--customer1.Order
4、事件的处理器--Waiter1.Action
5、事件的订阅--+=
事件简略声明相对与完整声明主要的改动
事件触发简略声明需要注意的是因为不同于完整声明,简略声明已经将委托字段省略掉所以本应调用字段orderEventHandler在此处会报错,此时按照C#的语法糖衣应该用事件order去替换掉orderEventHandler。简而言之,相对于完整声明,简略声明省略掉了委托字段、事件的添加器与移除器以及添加语法糖衣将事件order去替换掉事件拥有者customer的委托调用
根据方法的单一职责(single responsibility)的原则,一个方法只能完成一个功能,约定事件的触发方法前面需要加On
代码实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
/********************************************事件调用********************************************************/
class program
{
static void Main (string[] args )
{
//声明事件的五个部分:
//1、事件的拥有者--customer1
//2、事件的响应者--Waiter1
//3、事件--customer1.Order
//4、事件的处理器--Waiter1.Action
//5、事件的订阅--+=
//6、事件的触发应该在事件的拥有者里去触发
Customer customer1 = new Customer();
Waiter Waiter1 = new Waiter();
customer1.Order += Waiter1.Action;//<5>事件订阅事件处理器,处理器位于事件响应者中
Console.Read();
customer1.Think();
customer1.PayTheBill();
Console.WriteLine("Mission complete");
Console.ReadKey();
}
}
public class OrderEventArgs:EventArgs
{
//声明属性时应当先输入prop,然后再敲击两下TAB键会自动声明后面的get,set方法
public string DishName { get; set; }
public string Size { get; set; }
}
//委托类型
public delegate void OrderEventHandler(Customer Customer, OrderEventArgs e);
public class Customer
{
//委托字段,用于存储和引用事件处理器
//private OrderEventHandler orderEventHandler;//1、...委托简略声明可将委托字段省略
//事件声明
public event OrderEventHandler Order;
//2、...在简略声明里会将事件的添加器与移除器的声明也省略掉
/*
{
//事件添加器
add
{
//订阅用+=符号表示,value
this.orderEventHandler += value;
}
//事件处理器的移除器
remove
{
this.orderEventHandler -= value;
}
}
*/
public double Bill { get; set; }
public void PayTheBill ()
{
Console.WriteLine("I will pay the {0} $",this.Bill);
}
public void Think()
{
Console.WriteLine("I am thinking...");
this.Onorder();
}
//根据方法的单一职责(single responsibility)的原则,一个方法只能完成一个功能,约定事件的触发方法前面需要加On
protected void Onorder()
{
//事件触发完整声明
/*
if (this.orderEventHandler != null)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = "Potato";
e.Size = "large";
//触发事件用Invoke
this.orderEventHandler.Invoke(this, e);
}
*/
//3、事件触发简略声明,需要注意的是因为不同于完整声明,简略声明已经将委托字段省略掉所以本应调用字段orderEventHandler在此处
//会报错,此时按照C#的语法糖衣应该用事件order去替换掉orderEventHandler。简而言之,相对于完整声明,简略声明省略掉了委托字段、
//事件的添加器与移除器以及添加语法糖衣将事件order去替换掉事件拥有者customer的委托调用
if (this.Order != null)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = "Potato";
e.Size = "large";
//触发事件用Invoke
this.Order.Invoke(this, e);
}
}
}
public class Waiter
{
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;
}
}
}
没有外部事件参数传递的情况示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
//事件及委托调用方法
class CustomerDashList
{
protected int dash1;
protected int dash2;
protected int dash3;
}
//declear delegate 声明委托>>此委托未包含实例传递
public delegate int ServerClear(int x, int y, int z);
class Customer:CustomerDashList
{
//declear event 声明事件及名称
public event ServerClear ClearEvent;
public void OrderDash(int x,int y,int z)
{
this.dash1 = x;
this.dash2 = y;
this.dash3 = z;
}
public void Checkout()
{
int money;
//quote the event调用事件
if (ClearEvent != null)
money = ClearEvent(dash1, dash2, dash3);
else
money = 0;
Console.WriteLine("you need pay {0} dallers", money);
}
}
class Server
{
public int ClearDish(int x,int y, int Z)
{
Console.WriteLine("at your service!");
return x * 10 + y * 15 + Z * 20;
}
}
class DelegateOrder
{
static void Main(string[] args)
{
Customer c1 = new Customer();
Customer c2 = new Customer();
Server s1 = new Server();
//subscribe delegate
c1.ClearEvent += new ServerClear(s1.ClearDish);
c2.ClearEvent += new ServerClear(s1.ClearDish);
c1.OrderDash(1, 2, 5);
c2.OrderDash(0, 2, 2);
c1.Checkout();
c2.Checkout();
Console.ReadKey();
}
}
}