委托和事件本身没有可比性,因为委托是类型,事件是对象,常在一起比较的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。两者的关系是:事件的内部是用委托实现的。
因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。(个人觉得可以参考listbox的相关操作将其理解为listbox.items.add()和listbox.items.remove()操作。
事件是用来限制委托实例的。事件只能+=、-=,不能直接赋值,不能清空,不能外部触发事件。
假设我们定义了这一个委托
public delegate void MyDelegate();
再定义该委托相关的事件:
public event MyDelegate Event;
相当于在后台实现了如下操作:
private MyDelegate OnEvent;
public void Add(MyDelegate d)
{
OnEvent+=d;
}
public void Remove(yDelegate d)
{
OnEvent-=d;
}
这就好理解了为什么事件只能+=,-=,而不能有其它的操作。