事件的基本使用 聲明一個事件很簡單,只需在聲明一個委托對象時加上event關鍵字就行。如下: public delegate void PriceChangedHandler (decimal oldPrice, decimal newPrice);public class IPhone6 { pu ...
事件的基本使用
聲明一個事件很簡單,只需在聲明一個委托對象時加上event關鍵字就行。如下:
public delegate void PriceChangedHandler (decimal oldPrice, decimal newPrice);
public class IPhone6 { public event PriceChangedHandler PriceChanged; }
事件的使用和委托完全一樣,只是多了些約束。下麵是一個簡單的事件使用例子:
public delegate void PriceChangedHandler(decimal oldPrice, decimal newPrice); public class IPhone6 { decimal price; public event PriceChangedHandler PriceChanged; public decimal Price { get { return price; } set { if (price == value) return; decimal oldPrice = price; price = value; // 如果調用列表不為空,則觸發。 if (PriceChanged != null) PriceChanged(oldPrice, price); } } } class Program { static void Main() { IPhone6 iphone6 = new IPhone6() { Price = 5288 }; // 訂閱事件 iphone6.PriceChanged += iphone6_PriceChanged; // 調整價格(事件發生) iphone6.Price = 3999; Console.ReadKey(); } static void iphone6_PriceChanged(decimal oldPrice, decimal price) { Console.WriteLine("年終大促銷,iPhone 6 只賣 " + price + " 元, 原價 " + oldPrice + " 元,快來搶!"); } }View Code
運行結果:
有人可能會問,如果把上面的event關鍵字拿掉,結果不是一樣的嗎,到底有何不同?
沒錯可以用事件的地方就一定可以用委托代替。
但事件有一系列規則和約束用以保證程式的安全可控,事件只有 += 和 -= 操作,這樣訂閱者只能有訂閱或取消訂閱操作,沒有許可權執行其它操作。如果是委托,那麼訂閱者就可以使用 = 來對委托對象重新賦值(其它訂閱者全部被取消訂閱),甚至將其設置為null,甚至訂閱者還可以直接調用委托,這些都是很危險的操作,廣播者就失去了獨享控制權。
事件保證了程式的安全性和健壯性。