C#事件基于委托
1、事件声明完整格式范例:
class Program
{
static void Main(string[] args)
{
Customer customer = new Customer();//新建顾客
Waiter waiter = new Waiter();//新建服务员
customer.Order += waiter.Action;//服务员订阅顾客下单事件
customer.Action();//顾客下单
customer.PayTheBill();//顾客付钱
Console.ReadKey();
}
}
//自定义事件参数,默认以EventArgs结尾,需要继承EventArgs类
public class OrderEventArgs:EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
//声明委托类型
public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);
public class Customer
{
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("I will pay ${0}.",Bill);
}
//声明委托字段
private OrderEventHandler orderEventHandler;
//定义事件
public event OrderEventHandler Order
{
add
{
orderEventHandler += value;
}
remove
{
orderEventHandler -= value;
}
}
public void Action()
{
Console.WriteLine("Walk into the restaurant.");
Console.WriteLine("Sit down.");
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Let me think...");
System.Threading.Thread.Sleep(1000);
}
OnOrder("ManHanQuanXi", "large");
}
//触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发
private void OnOrder(string dishName,string size)
{
if (Order != null)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = dishName;
e.Size = size;
//触发事件
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;//返回顾客订单价格
}
}
2、事件声明简化格式范例:
class Program
{
static void Main(string[] args)
{
Customer customer = new Customer();//新建顾客
Waiter waiter = new Waiter();//新建服务员
customer.Order += waiter.Action;//服务员订阅顾客下单事件
customer.Action();//顾客下单
customer.PayTheBill();//顾客付钱
Console.ReadKey();
}
}
//事件参数,默认以EventArgs结尾,需要继承EventArgs类
public class OrderEventArgs:EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
//声明委托类型
public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);
public class Customer
{
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("I will pay ${0}.",Bill);
}
//定义事件
public event OrderEventHandler Order;
public void Action()
{
Console.WriteLine("Walk into the restaurant.");
Console.WriteLine("Sit down.");
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Let me think...");
System.Threading.Thread.Sleep(1000);
}
OnOrder("ManHanQuanXi", "large");
}
//触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发
private void OnOrder(string dishName,string size)
{
if (Order != null)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = dishName;
e.Size = size;
//触发事件
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;//返回顾客订单价格
}
}
3、事件声明通常不需要自定义委托类型,一般使用系统自带的EventHandler 类型
class Program
{
static void Main(string[] args)
{
Customer customer = new Customer();//新建顾客
Waiter waiter = new Waiter();//新建服务员
customer.Order += waiter.Action;//服务员订阅顾客下单事件
customer.Action();//顾客下单
customer.PayTheBill();//顾客付钱
Console.ReadKey();
}
}
//事件参数,默认以EventArgs结尾,需要继承EventArgs类
public class OrderEventArgs:EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
public class Customer
{
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("I will pay ${0}.",Bill);
}
//定义事件
public event EventHandler Order;
public void Action()
{
Console.WriteLine("Walk into the restaurant.");
Console.WriteLine("Sit down.");
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Let me think...");
System.Threading.Thread.Sleep(1000);
}
OnOrder("ManHanQuanXi", "large");
}
//触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发
private void OnOrder(string dishName,string size)
{
if (Order != null)
{
OrderEventArgs e = new OrderEventArgs();
e.DishName = dishName;
e.Size = size;
//触发事件
Order.Invoke(this, e);
}
}
}
public class Waiter
{
public void Action(object sender, EventArgs e)
{
Customer customer = sender as Customer;
OrderEventArgs e2 = e as OrderEventArgs;
Console.WriteLine("I will serve you the dish : {0}.",e2.DishName);
double price = 10;
switch (e2.Size)
{
case "small":
price *= 0.5;
break;
case "large":
price *= 1.5;
break;
default:
break;
}
customer.Bill += price;//返回顾客订单价格
}
}



