资料来源于刘铁猛的视频
1 完整申明
using System; using System.Threading; using System.Windows.Forms; namespace EventExample { class Program { static void Main(string[] args) { Customer customer = new Customer(); Waitor waitor = new Waitor(); customer.Order += waitor.Action; customer.Action(); customer.PayTheBill(); } } 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 { private OrderEventHandler orderEventHandler; //申明事件 public event OrderEventHandler Order { add { this.orderEventHandler += value; } remove { this.orderEventHandler -= value; } } public double Bill { get; set; } public void PayTheBill() { Console.WriteLine("I will pay ${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.orderEventHandler != null) { OrderEventArgs e = new OrderEventArgs(); e.DishName = "KongPao"; e.Size = "large"; this.orderEventHandler.Invoke(this, e); } } public void Action() { Console.ReadLine();//程序需要等一会儿 this.WalkIn(); this.SitDown(); this.Think(); } } class Waitor { internal 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 *= 2; break; default: break; } //throw new NotImplementedException(); customer.Bill += price; } } }
2 简化申明
using System; using System.Threading; using System.Windows.Forms; namespace EventExample { class Program { static void Main(string[] args) { Customer customer = new Customer(); Waitor waitor = new Waitor(); customer.Order += waitor.Action; customer.Action(); customer.PayTheBill(); } } 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 event OrderEventHandler Order; //完整申明 //private OrderEventHandler orderEventHandler; //public event OrderEventHandler Order //{ // add // { // this.orderEventHandler += value; // } // remove // { // this.orderEventHandler -= value; // } //} public double Bill { get; set; } public void PayTheBill() { Console.WriteLine("I will pay ${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 = "KongPao"; e.Size = "large"; this.Order.Invoke(this, e); } } public void Action() { Console.ReadLine();//程序需要等一会儿 this.WalkIn(); this.SitDown(); this.Think(); } } class Waitor { internal 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 *= 2; break; default: break; } //throw new NotImplementedException(); customer.Bill += price; } } }
3 申明为委托字段时也可以运行
using System; using System.Threading; using System.Windows.Forms; namespace EventExample { class Program { static void Main(string[] args) { Customer customer = new Customer(); Waitor waitor = new Waitor(); customer.Order += waitor.Action; customer.Action(); customer.PayTheBill(); } } 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 OrderEventHandler Order; // //完整申明 //private OrderEventHandler orderEventHandler; //public event OrderEventHandler Order //{ // add // { // this.orderEventHandler += value; // } // remove // { // this.orderEventHandler -= value; // } //} public double Bill { get; set; } public void PayTheBill() { Console.WriteLine("I will pay ${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 = "KongPao"; e.Size = "large"; this.Order.Invoke(this, e); } } public void Action() { Console.ReadLine();//程序需要等一会儿 this.WalkIn(); this.SitDown(); this.Think(); } } class Waitor { internal 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 *= 2; break; default: break; } //throw new NotImplementedException(); customer.Bill += price; } } }
4 但这样可能会出错,不是我们所希望的。
using System; using System.Threading; using System.Windows.Forms; namespace EventExample { class Program { static void Main(string[] args) { Customer customer = new Customer(); Waitor waitor = new Waitor(); customer.Order += waitor.Action; OrderEventArgs e = new OrderEventArgs(); e.DishName = "TuDouSi"; e.Size = "large"; OrderEventArgs e2 = new OrderEventArgs(); e2.DishName = "Beer"; e2.Size = "large"; //这样外面可以访问了 Customer badGuy = new Customer(); //badguy给别人点菜了 badGuy.Order += waitor.Action; badGuy.Order.Invoke(customer, e); badGuy.Order.Invoke(customer, e2); customer.PayTheBill(); } } 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 OrderEventHandler Order; // //完整申明 //private OrderEventHandler orderEventHandler; //public event OrderEventHandler Order //{ // add // { // this.orderEventHandler += value; // } // remove // { // this.orderEventHandler -= value; // } //} public double Bill { get; set; } public void PayTheBill() { Console.WriteLine("I will pay ${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 = "KongPao"; e.Size = "large"; this.Order.Invoke(this, e); } } public void Action() { Console.ReadLine();//程序需要等一会儿 this.WalkIn(); this.SitDown(); this.Think(); } } class Waitor { internal 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 *= 2; break; default: break; } //throw new NotImplementedException(); customer.Bill += price; } } }不要用3,4
自带的EventHandler使用
using System; using System.Threading; using System.Windows.Forms; namespace EventExample { class Program { static void Main(string[] args) { Customer customer = new Customer(); Waitor waitor = new Waitor(); customer.Order += waitor.Action; customer.Action(); customer.PayTheBill(); } } 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 event EventHandler Order; //关键是event public double Bill { get; set; } public void PayTheBill() { Console.WriteLine("I will pay ${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 = "KongPao"; e.Size = "large"; this.Order.Invoke(this, e); } } public void Action() { Console.ReadLine();//程序需要等一会儿 this.WalkIn(); this.SitDown(); this.Think(); } } class Waitor { internal void Action(object sender, EventArgs e) { Customer customer = sender as Customer; OrderEventArgs orderInfo = e as OrderEventArgs; Console.WriteLine("I will serve you the dish {0}", orderInfo.DishName); double price = 10; switch (orderInfo.Size) { case "small": price *= 0.5; break; case "large": price *= 2; break; default: break; } //throw new NotImplementedException(); customer.Bill += price; } } }
using System; using System.Threading; using System.Windows.Forms; namespace EventExample { class Program { static void Main(string[] args) { Customer customer = new Customer(); Waitor waitor = new Waitor(); customer.Order += waitor.Action; customer.Action(); customer.PayTheBill(); } } 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 event EventHandler Order; // //完整申明 //private OrderEventHandler orderEventHandler; //public event OrderEventHandler Order //{ // add // { // this.orderEventHandler += value; // } // remove // { // this.orderEventHandler -= value; // } //} public double Bill { get; set; } public void PayTheBill() { Console.WriteLine("I will pay ${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); } this.OnOrder("Tudousi", "large"); } protected void OnOrder(string dishName, string size) { OrderEventArgs e = new OrderEventArgs(); e.DishName = dishName; e.Size = size; this.Order.Invoke(this, e); } public void Action() { // Console.ReadLine();//程序需要等一会儿 this.WalkIn(); this.SitDown(); this.Think(); } } class Waitor { internal void Action(object sender, EventArgs e) { Customer customer = sender as Customer; OrderEventArgs orderInfo = e as OrderEventArgs; Console.WriteLine("I will serve you the dish {0}", orderInfo.DishName); double price = 10; switch (orderInfo.Size) { case "small": price *= 0.5; break; case "large": price *= 2; break; default: break; } //throw new NotImplementedException(); customer.Bill += price; } } }
一个类对外的接口主要有三个:方法,属性,事件=== 做事件, 荐储数据,通知别人