声明一个委托,得到的是一个类型,通过这个类型可以实例化出真正的对象,这个真正的对象可以绑定函数。
而事件,就像是委托实例化出来的对象(变量),可以绑定函数,然后触发。
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); } } }