using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
/*
事件的简单声明
public event EventHandler Order;
看起来像一个字段,但是不是,内部里面隐藏了
*/
namespace six_ThreeEventHandler
{
internal class Program
{
static void Main(string[] args)
{
Customer customer = new Customer();
Waiter waiter = new Waiter();
customer.Order += waiter.Action;
customer.Action();
customer.PayTheBill();
}
}
public delegate void EventHandler(Customer customer, OrderEventArgs e);
public class OrderEventArgs : EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
public class Customer
{
public event EventHandler Order;
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("I will Pay the {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)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = "kongbao chicken";
e.Size = "large";
this.Order.Invoke(this,e);
}
}
public void Action()
{
Console.ReadLine();
this.WalkIn();
this.SitDown();
this.Think();
}
}
public class Waiter
{
internal void Action(Customer customer, OrderEventArgs e)
{
Console.WriteLine("I will server you to {0}",e.DishName);
double price = 10;
switch (e.Size)
{
case "large":
price = price * 1.5;
break;
case "small":
price = price * 0.5;
break;
default:
break;
}
customer.Bill += price;
}
}
}
此代码与前完整声明的代码差别就在于,事件的声明这里,简单声明我们可以看到,这是一个类似于字段的事件声明,之所以这里没有字段的声明,是C#在编写初边将这个隐藏起来了
我们可以通过反编译来进行查看
打开Developer Command Prompt for vs 2022 命令窗口
在里面输入ildasm进入反编译,将应用程序文件拖入到里面
我们可以看到绿色向下的箭头就是事件Order 上面也有一个水蓝色的菱形Order,但是这是一个字段,在编写初就被隐藏起来,所以我们在代码里面无法看到