有很多同学在学习C#的委托和事件时,都一头雾水,有的不理解委托和事件到底是什么东西,有的理解了概念,但不知道在什么场景中应该应用委托和事件,今天我们就一起总结下委托和事件的知识点:
【委托】
我们先从字面上理解委托,就是将事情托付给别人做,而非自己亲自做,自己只负责通知。
宏观上来看,委托就是一种通知机制,通知者需要做某事时,发起通知(Invoke),委托列表的订阅者得到通知,委托列表中的方法被顺序执行。
委托还可以理解成一种容器,容器里放的是函数方法,如:
delegate void fun(int a,int b);
上句定义了一个委托fun,它有两个输入参数:a,b;返回参数为 void。
可以使用+=,=,-=往委托容器里添加或移除方法。
使用fun.invoke(a,b)或fun(a,b)触发委托,会将容器里的所有方法调用一遍。
有的同学可能觉得委托没什么用,不就是传个方法名,然后委托Invoke后再顺序执行方法吗,我按顺序一个个执行方法不也一样吗?其实,在C#中,因为取消了指针,很多事情,只能靠委托来完成,比如,在A类中实例化了B类,那A类中可以B类的数据,但B类却拿不到A类的数据,这时就需要在B类中声明一个委托,然后在A类中注册,这样B类委托被执行时,就可以拿到A类的数据了。
【事件】
委托和事件的关系,类似于 字段和属性的关系。事件内部封装了一个委托,并对其进行了一些访问限制。
限制1:事件只能在定义类中Invoke;
例如:在B类定义委托,因为需在其他类中注册,通常将委托定义成public的,那么在其他类中,就可以调用委托的Invoke,这样就"冒充通知”,因为B才是真正的通知者。这在某些严格场景下是被允许的,那么此时使用事件就可以解决这个问题。
限制2:事件只能用+=,-=注册或移除方法列表;
委托可以使用=来注册方法,这样之前注册的方法将被覆盖,可能会导致问题。事件则杜绝了这种错误。