namespace Lesson13_事件 { #region 知识点一 事件是什么 //事件是基于委托的存在 //事件是委托的安全包裹 //让委托的使用具有安全性 //事件 是一种特殊的变量类型 #endregion #region 知识点二 事件怎么使用 //声明语法: //访问修饰符 event 委托类型 事件名称; //事件的使用: //1.事件是作为 成员变量存在于类中 //2.委托怎么用 事件就怎么用 //事件相对于委托的区别 //1.不能在类外部 赋值 //2.不能在类外部 调用 //注意: //他只能作为成员存在于类和接口以及结构体中 class Test { //委托成员变量 用于存储 函数 public Action myFun; //事件成员变量 用于存储 函数 public event Action myEvent; public Test() { //事件的使用和委托 一模一样 只是有些细微的区别 myFun = TestFun; myFun += TestFun; myFun.Invoke(); myFun(); myFun = null; myEvent = TestFun; myEvent += TestFun; myEvent.Invoke(); myEvent(); myEvent = null; } public void TestFun() { Console.WriteLine("TestFun"); } public void DoEvent() { if (myEvent != null) { myEvent(); } } } #endregion #region 知识点三 为什么有事件 #endregion class Program { static void Main(string[] args) { Test t = new Test(); //委托可以在外部赋值 t.myFun += TestFunOut; t.myFun = null; //事件不能在外部赋值 //但事件可以在外部添加函数 //t.myEvent = null;//错误 事件不能在类外部赋值 //t.myEvent = TestFunOut;//错误 事件不能在类外部赋值 t.myEvent += TestFunOut; t.myEvent -= TestFunOut;//正确 //事件不能在外部调用 t.myFun(); t.myFun.Invoke(); //t.myEvent();//错误 事件不能在类外部调用 //t.myEvent.Invoke();//错误 事件不能在类外部调用 //如果需要在外部调用,那么最好在类中提供一个调用事件的函数 t.DoEvent(); Action a = TestFunOut; //event Action a1 = TestFunOut;// //总结 //事件是对委托的安全包裹 } static void TestFunOut() { Console.WriteLine("TestFunOut"); } } }