Table of Contents

C#事件

对比委托:“事件是委托的特殊实现,事件是建立在对委托的语言支持之上的。”

“事件是一种特殊的委托,本质就是委托,事件是回调机制的一种应用”

事件是依赖于委托的


理解

声明一个委托,得到的是一个类型,通过这个类型可以实例化出真正的对象,这个真正的对象可以绑定函数。

而事件,就像是委托实例化出来的对象(变量),可以绑定函数,然后触发。

演示

namespace Zhonghui
{ 
    class MainApp
    {
        delegate void Say(string Text); // 委托,声明委托并没有得到任何“变量”
        event Say? OnSay; // 事件,除了前面加一个event,别的就像是在声明一个委托变量
        // 编译器:建议委托类型后面加?,声明成可空类型
        Say m_OutSay = new Say(MainApp.ASay); // 委托在这里也是可以实例化的,只是可能不好绑定函数
 
        static void Main()
        {
            var MainData = new MainApp();
 
            // 事件在使用之前,没有使用new实例化的步骤
            MainData.OnSay += MainApp.ASay; // 注册事件,在注册事件之前,这个事件没有订阅者
            // Main.OnSay后面可以继续添加绑定的函数
 
            MainData.OnSay.Invoke("Hello"); // 可以使用Invoke触发
            MainData.OnSay("Hello"); // 可以直接调用
 
            MainData.m_OutSay("Member Say"); // 作为成员变量的委托也是可以调用的
 
            // 委托在使用之前,必须先实例化
            var ThisSay = new Say(MainApp.BSay); // 区别:实例化一个委托的时候,必须给一个参数
            // ThisSay后面可以继续添加绑定的函数,和事件一样,都可以实现多播
 
            ThisSay.Invoke("Hello Again"); // 可以使用Invoke触发
            ThisSay("Hello Again"); // 可以直接调用
 
            var AnotherSay = ThisSay; // 委托可以随便实例化变量,随便传递,事件好像不行
            AnotherSay("Another Say");
 
            // event Say? OnLocalSay;
            // 在这里声明一个本地的Event甚至会编译错误
        }
 
        static void ASay(string Text)
        {
            Console.WriteLine("A: " + Text);
        }
 
        static void BSay(string Text)
        {
            Console.WriteLine("B: " + Text);
        }
    }
}

问题