作者:Jaraxuss
链接:https://www.zhihu.com/question/21638630/answer/156701628
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
先不着急看代码 ,从字面上理解 “委托”,即:将事情托付给别人做,而非自己亲自做。宏观上看,委托就是一种通知机制,在我(通知者)需要做某事的时候,发起通知(Invoke),你们(委托列表中的订阅者)得到通知后,帮我完成某事(委托列表中的方法被顺序执行)。有些初学者可能觉得委托没什么用,不就是能传个方法名,然后委托Invoke后再顺序执行方法吗,我按顺序一个个调方法不也一样?其实,在C#中,因为取消了指针,很多事情,只能靠委托来完成。比如,在A类某方法中实例化B类,那么在A类中可以拿到B类被实例化的对象,就可以直接调用B类的方法,然而,如果想在B类中调用A类的方法,就没那么容易了,因为:B中拿不到A对象的指针。这时,只需要在B中声明一个委托,后在A中实例化B的时候,讲需要调用的方法注册进B的委托即可。这样,在B的委托Invoke时,A中的方法也会被调用。
而事件,本质上是一种特殊的委托对象,准确来讲,是“优化过”的委托对象。第一,在B类中定义了委托,若是public则可以在A类(或任何其他类)中被Invoke,即“冒充通知”了(因为原本B才是通知者,这样通知机智就被破坏了),若是事件,则不行(事件只允许在声明类中被Invoke);第二,委托对象可以用+=或-=注册或移除方法列表,但也能直接用=,这样之前被注册的方法列表将被覆盖,这样很容易造成程序员犯错误。反观事件,只能用+=/-=来注册/移除方法,杜绝了程序员犯错的可能性。