C#中的委托你可以把它理解成是一种“允许你将方法(函数)作为变量进行保存,传递和使用”的功能。
事件(event关键字)是针对委托的一种额外封装,有点类似public,private对一个变量的修饰。
如果只是单纯的委托,你可以在类的外部直接对其进行调用(执行);但是如果你用event 关键字修饰过,那么这个你想执行这个委托只能在类内部,外部只能进行注册或者注销。
比如我这边定义了一个很简单的委托:
public delegate void OnDelegateCalled();
然后我定义了一个类,里面有这个委托的实例:
public class DelegateTest
{
public OnDelegateCalled DelegateCalled;
}
然后我在代码中使用:
var delegateTest = new DelegateTest();
delegateTest.DelegateCalled = new OnDelegateCalled(Console.WriteLine);
delegateTest.DelegateCalled();
这样做语法上没有任何问题,最后也可以顺利执行。在某些情境中也不会有逻辑问题。
但是如果你把这个委托包装成一个事件的话,就不太一样了:
public class DelegateTest
{
public event OnDelegateCalled DelegateCalled;
}
这时,如果你还想上面的代码那样,编译器是会报错的。它告诉你,DelegateCalled只能出现在+=或者-=的左边。也就是你要这样赋值:
var delegateTest = new DelegateTest();
delegateTest.DelegateCalled += Console.WriteLine;
这个一般就叫注册一个事件。相对的-=就是注销。并且最后的调用也只能在DelegateTest这个类的内部进行。
event关键字简单地说就是用来控制委托的赋值和调用时机的。
就用你说的开关事件为例,原则上你只需要告诉我你按下开关时要做什么,然后你去按开关就行了。最后触发了哪些事件,按什么顺序触发的,是不需要你操心的。