前言
之前写过有关委托、事件、订阅的笔记,但是坦白地说,含有装逼的成分。传送门:
上面的例子中,用到了 event 关键字,实际上也确实要用 event 关键字,但是不清楚 event 的作用。
那 event 到底有啥作用
根据我现在知道的,就一个作用:让委托只能由事件源触发,而不允许别的地方通过函数调用的方式触发。
新建一个控制台程序,写一个简单的例子。如下所示:
定义一个 Reader 类,类里定义了一个委托类型 ReadHandler ,返回值为 void,参数为 string。
接着用这个委托类型,定义一个字段 Read,有 A、B 两种方式,A 使用了 event,B 没有,但都不报错。(Visual Studio 里面对 Read 的标注确实是字段)
类里有个 Run() 方法,会触发这个委托。
class Reader { public delegate void ReadHandler(string key); //public event ReadHandler Read; ..............A public ReadHandler Read; ..............B public void Run() { Console.Write("Read: "); string input = Console.ReadLine(); Read(input); } }
接下来在主函数中,实例化 Reader 类,并注册 Print() 方法到 Read 里。委托的执行有 C、D 两种方式,C 是直接调用委托对象的 Read 字段触发,D 是在委托对象的方法中触发。
class Program { static void Main(string[] args) { Reader reader = new Reader(); reader.Read += new Reader.ReadHandler(Print); reader.Read("Hello"); ..........C //reader.Run(); ..........D } static void Print(string data) { Console.WriteLine("Print: " + data); Console.ReadLine(); } }
先使用 B + C 组合:不加 event ,而且直接调用:不报错,程序打印出 “Hello”。
再使用 A + C 组合:开启 event,还是直接调用:这次就报错了,提示:
使用 B + D 组合:不加 event ,让对象去触发:不报错,程序打印出输入的内容。
使用 A + D 组合:开启 event ,让对象去触发:不报错,程序打印出输入的内容。
综上
综上实验,一句话总结 event 关键字的作用,就是要让 “事件” 成为 “事件” ,既然是事件,就不能哪儿都能调用,触发的权限,就留给事件源吧!
正如 Visual Studio 所说,从类型 “Reader” 中使用除外。