C#委托和事件
事件是受限制的委托,是委托一种特殊应用,事件是委托的一个修饰符,加了event(事件)修饰之后,委托就被限制了,
假设这个加了修饰符的事件称为事件1,通过事件1,我们可以更好地控制注册和注销,也就是对于一个外部类,他只能“注册自己+=、注销自己-=”,
并且他只能注册自己内部的方法到事件上,另外,外界也不能主动地触发一个事件,通常我们unity声明周期唤醒的时候注册事件,在OnDestroy的时候注销事件。
1 public static class lesson_EventSysteam 2 { 3 public delegate void SendStrHandle(string str);//声明一个委托 4 static public event SendStrHandle sendStr;// (注册监听) 注册事件类型的委托 5 static public void RaiseSendStr(string str)//(发起广播) 发起委托的函数 6 { 7 if (sendStr != null) 8 { 9 sendStr(str); 10 } 11 } 12 }
1 public class Lessontest : MonoBehaviour 2 { 3 void Start() 4 { 5 // lesson_EventSysteam.sendStr("haha");//外部调用委托 6 lesson_EventSysteam.sendStr += someFunc; 7 } 8 void someFunc(string str) 9 { 10 11 } 12 }
解释一下为什么把event去掉,执行效果不变。那又为什么要增加一个事件的关键字?
1.委托可以把一个方法作为参数代入另一个方法。
2.委托是类型,事件是对象.
3.其实事件是委托的一个修饰符,加了event(事件)修饰之后,委托就被限制了,假设这个加了修饰符的事件称为事件1,
通过事件1我们可以更好地控制注册和注销,也就是对于一个外部类,他只能“注册自己+=、注销自己-=”,他只能注册自己内部的方法到事件上。
另外,外界也不能主动地触发一个事件。事件只能add、remove自己,不能赋值。
也就是说事件只能+=、-=,不能= 。事件内部就是一个private的委托和add
总结:
事件与委托最主要的区别应该是事件不能在外部调用,但可以通过+=或-=进行注册,但如果委托变量为私有,
则外部不能注册;如果为公有,则外部又可以调用,破坏了封装,所以就定义一个event进行限制是最合适的.