事件的声明

 

注意事件的声明 .NET已经提供EventHandler EventArgs类,不需要额外声明事件的委托,但是在事件的处理器中需要类型转换

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.AccessControl;
using System.Text;
using System.Threading.Tasks;
using static System.Net.Mime.MediaTypeNames;
using System.Timers;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
Custorm custorm = new Custorm();
Waiter waiter = new Waiter();
custorm.Order += waiter.Action;//挂接事件
custorm.Action();//事件触发
custorm.PayBill();
Console.ReadLine();
}
}
public delegate void OrderEnentHandler(Custorm custorm, OrderEventArgs e);//定义一个委托用于声明事件

public class OrderEventArgs : EventArgs//事件的参数 继承于EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}

public class Custorm//定义事件的拥有者及事件
{
#region 事件的详细声明
//private OrderEnentHandler orderEnentHandler;//定义委托的实例
//public event OrderEnentHandler Order//声明事件
//{
// add { orderEnentHandler += value; }
// remove { orderEnentHandler -= value; }
//}
#endregion

#region 事件的简略声明
public event OrderEnentHandler Order;//定义委托的实例 去掉event 就是委托字段,如果Custorm类不执行think方法,会导致“借刀杀人”
#endregion
protected void Think()//事件触发条件
{
if (this.Order != null)//简略声明事件 用.操作符,非常让人误解为order是委托字段,实际事件只能用+-操作
{
OrderEventArgs orderEvent = new OrderEventArgs();
orderEvent.DishName = "KongPao Chicken";
orderEvent.Size = "Big";
this.Order.Invoke(this, orderEvent);
}
}
public void Action()
{
this.Think();
}
public double Bill { get; set; }
public void PayBill()
{
Console.WriteLine($"I pay {Bill}");
}
}
public class Waiter//定义事件处理器的对象
{
public void Action(Custorm custorm, OrderEventArgs e)//事件处理器 注意事件的参数是 事件的拥有者里面的参数往事件处理器传送
{
Console.WriteLine($"I will server you the dish-{e.DishName}");
double price = 10;
if (e.Size == "small") { price = price * 2; }
if (e.Size == "Big") { price = price * 10; }
custorm.Bill += price;
}
}

}

 

posted @ 2025-07-10 09:16  C#菜鸟……  阅读(4)  评论(0)    收藏  举报