吴劲韬

null

null

C# 事件与委托的区别

C# 事件与委托的区别

先看一段程序

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Test obj = new Test();
  6. obj.print += printout1; //绑定printout1方法
  7. obj.print += printout2; //绑定printout2方法
  8. obj.start();
  9. }
  10. static void printout1()
  11. {
  12. Console.WriteLine("输出第一段字符串");
  13. }
  14. static void printout2()
  15. {
  16. Console.WriteLine("输出第二段字符串");
  17. }
  18. }
  19. public delegate void Print(); //创建委托
  20. class Test
  21. {
  22. public event Print print; //创建事件实例
  23. public void start()
  24. {
  25. print(); //触发事件
  26. }
  27. }

上面的代码使用的是标准的事件委托格式,现在我将其中的event关键字去掉,你会发现程序依然可以正常的运行,不会出现任何的问题。

事件实际上是一个特殊的委托实例,不用事件也没有关系。实际上事件只是削弱了委托的功能,event在编译器角度保护了你程序安全,因为你只能使用+=-= 来注册事件了,而不能使用 = 为事件关联方法。(在委托中还可以使用=来绑定方法,不过=是一种破坏性代码,不管之前是否已经绑定的有方法了,他都会将其清除)

例子:将上面的代码为事件绑定方法的部分中的 += 换成 = 编译器就会报错

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Test obj = new Test();
  6. obj.print = printout1; //绑定printout1方法时出错
  7. obj.start(); //事件不能使用等号运算符绑定方法
  8. }
  9. static void printout1()
  10. {
  11. Console.WriteLine("输出第一段字符串");
  12. }
  13. }
  14. public delegate void Print(); //创建委托
  15. class Test
  16. {
  17. public event Print print; //创建事件实例
  18. public void start()
  19. {
  20. print(); //触发事件
  21. }
  22. }
错误提示
posted @ 2016-02-17 23:15  吴劲韬  阅读(5646)  评论(0编辑  收藏  举报