先看一段程序
- class Program
- {
- static void Main(string[] args)
- {
- Test obj = new Test();
- obj.print += printout1; //綁定printout1方法
- obj.print += printout2; //綁定printout2方法
- obj.start();
- }
- static void printout1()
- {
- Console.WriteLine("輸出第一段字符串");
- }
- static void printout2()
- {
- Console.WriteLine("輸出第二段字符串");
- }
- }
- public delegate void Print(); //創建委托
- class Test
- {
- public event Print print; //創建事件實例
- public void start()
- {
- print(); //觸發事件
- }
- }
上面的代碼使用的是標准的事件委托格式,現在我將其中的event關鍵字去掉,你會發現程序依然可以正常的運行,不會出現任何的問題。
事件實際上是一個特殊的委托實例,不用事件也沒有關系。實際上事件只是削弱了委托的功能,event在編譯器角度保護了你程序的安全,因為你只能使用+=、-= 來注冊事件了,而不能使用 = 為事件關聯方法。(在委托中還可以使用=來綁定方法,不過=是一種破壞性代碼,不管之前是否已經綁定的有方法了,他都會將其清除)
例子:將上面的代碼為事件綁定方法的部分中的 += 換成 = 編譯器就會報錯
- class Program
- {
- static void Main(string[] args)
- {
- Test obj = new Test();
- obj.print = printout1; //綁定printout1方法時出錯
- obj.start(); //事件不能使用等號運算符綁定方法
- }
- static void printout1()
- {
- Console.WriteLine("輸出第一段字符串");
- }
- }
- public delegate void Print(); //創建委托
- class Test
- {
- public event Print print; //創建事件實例
- public void start()
- {
- print(); //觸發事件
- }
- }