标签:[] gate name lin 观察者模式 对比 div bsp get
1.添加三个类文件,定义三个类(猫、狗、老鼠)
猫是主要事件
namespace MyDelegate { public class Cat { public CatMiaoHandler CatMiaoHandlerMethod;//在Cat类实例化一个委托 public void Miao() { Console.WriteLine("猫,叫一声"); if (CatMiaoHandlerMethod!=null)//若委托不为空,执行委托 { CatMiaoHandlerMethod(); } } } public delegate void CatMiaoHandler(); }
namespace MyDelegate { public class Dog { public static void Wang() { Console.WriteLine("狗,叫一声"); } } }
namespace MyDelegate { public class Mouse { public static void Run() { Console.WriteLine("老鼠,跑"); } } }
2.当猫叫时,狗也叫,老鼠跑(这就是观察者模式)
Program程序如下
namespace MyDelegate { class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.CatMiaoHandlerMethod = new CatMiaoHandler(Dog.Wang);//委托 cat.CatMiaoHandlerMethod += Mouse.Run;//多播委托, cat.Miao(); Console.Read(); } } }
3.委托和事件的区别
namespace MyDelegate { class Program { static void Main(string[] args) { Cat cat = new Cat(); //--------------------------对比---------------------------- //cat.CatMiaoHandlerMethodEvent = new CatMiaoHandler(Dog.Wang); //此处会报错,事件不能实例化 //cat.CatMiaoHandlerMethodEvent = null;//此处会报错,事件不能赋null值 //cat.CatMiaoHandlerMethodEvent();//此处会报错,事件不能被外部调用 //cat.CatMiaoHandlerMethod = new CatMiaoHandler(Dog.Wang);//委托可以实例化 //cat.CatMiaoHandlerMethod = null;//委托可以赋值为null //cat.CatMiaoHandlerMethod();//委托可以直接调用 //--------------------------总结--------------------------- //委托不太安全,可能会被外部清除已经赋予的委托函数 cat.CatMiaoHandlerMethod += Dog.Wang; cat.CatMiaoHandlerMethod += Mouse.Run; cat.Miao(); //事件只能进行-=或+=赋值,不能进行=new或=null操作 cat.CatMiaoHandlerMethodEvent += Dog.Wang; cat.CatMiaoHandlerMethodEvent += Mouse.Run; cat.Miao(); Console.Read(); } } }
另外,委托可以按委托调用函数的顺序查看委托函数,而事件查看不了
foreach(CatMiaoHandler s in cat.CatMiaoHandlerMethod.GetInvocationList()) { Console.WriteLine(s.Method); }
标签:[] gate name lin 观察者模式 对比 div bsp get
原文地址:https://www.cnblogs.com/wskxy/p/9195519.html