区别:
委托是类型,事件是对象;
事件内部就是一个private的委托和add、remove两个方法;
委托可以在声明它的类外部进行调用,而事件只能在类的内部进行调用。
视频:
http://v.youku.com/v_show/id_XODkyMzE0NzY0.html
委托总结:
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用 If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
注意这里,第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。
使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
事件:
事件的声明与之前委托变量delegate1的声明唯一的区别是多了一个event关键字。看到这里,你差不多明白到:事件其实没什么不好理解的,声明一个事件不过类似于声明一个委托类型的变量而已。
实际上尽管我们在GreetingManager里将 MakeGreet 声明为public,但是,实际上MakeGreet会被编译成私有字段,难怪会发生上面的编译错误了,因为它根本就不允许在GreetingManager类的外面以赋值的方式访问。
MakeGreet 事件确实是一个GreetingDelegate类型的委托,只不过不管是不是声明为public,它总是被声明为private。另外,它还有两个方法,分别是add_MakeGreet和remove_MakeGreet,这两个方法分别用于注册委托类型的方法和取消注册,实际上也就是: “+= ”对应 add_MakeGreet,“-=”对应remove_MakeGreet。而这两个方法的访问限制取决于声明事件时的访问限制符。
为什么需要事件?
事件最常用的应用场景是图形用户界面(GUI),如WinForm和WebForm,需要程序来对事件作出响应。可以是一个按钮点击事件,菜单选择事件,文件传输完成事件等。简单的说,某件事发生了,你必须要作出响应。你不能预测事件发生的顺序。只能等事件发生,再作出相应的动作来处理。
在GUI环境里面,所有的控件都能触发事件,如你点击按钮,触发点击(Click)事件,你在下拉列表中增加了项目,出发了列表改动(ListChanged)事件。
其他的类会对响应这些事件感兴趣。触发事件的类本身对怎样处理事件不感兴趣。按钮说:“我被点过了”,响应类(如Form或Page)作出合适的响应。
发布和订阅
所有的对象都能发布一系列事件供其他类订阅。当发布对象触发事件的时候,所有订阅的类都会被通知到。有了这种机制,你的对象可以说,“我要告诉你们一些事情”,其他的类会说“好的,告诉我们发生什么了”。比如,一个按钮被点击的时候会通知那些感兴趣的观察者。按钮称为发布者,因为按钮发布了点击事件。其他类是订阅者,因为它们订阅了点击事件。注意发布类不需要知道或关系谁订阅了;它只管触发事件。谁响应了事件,怎么响应的,发布类都不关心。
为什么更麻烦了?
:因为事件中保存了一个符合委托签名的函数列表。使得业务逻辑的传递更灵活了。
我使用事件没有你说的这么麻烦?
:因为微软设计WinForm或者WebForm时已经把第1,3,4,5步都放在发布类中做过了。我们只需要在订阅类中做第2步就行了,自然简单。