C# event 关键字的作用

前言

之前写过有关委托、事件、订阅的笔记,但是坦白地说,含有装逼的成分。传送门:

C# 发布-订阅模式

C#委托和事件

上面的例子中,用到了 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” 中使用除外。

发表评论

Powered by WordPress | Theme Revised from Doo

苏ICP备18047621号

Copyright © 2017-2024 追光者博客