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进行限制是最合适的.

posted @ 2017-05-08 21:29  AaronBlogs  阅读(412)  评论(0编辑  收藏  举报