基本版:
using System; namespace EventDemo1 { public delegate void CatCallEventHandler(); public class Cat { //定义猫叫事件 public event CatCallEventHandler CatCall; public void OnCatCall() { Console.WriteLine("猫叫了一声"); CatCall?.Invoke(); } } public class Mouse { //定义老鼠跑掉方法 public void MouseRun() { Console.WriteLine("老鼠跑了"); } } public class People { //定义主人醒来方法 public void WakeUp() { Console.WriteLine("主人醒了"); } } class Program { static void Main(string[] args) { Cat cat = new Cat(); Mouse m = new Mouse(); People p = new People(); //关联绑定 cat.CatCall += new CatCallEventHandler(m.MouseRun); cat.CatCall += new CatCallEventHandler(p.WakeUp); cat.OnCatCall(); Console.ReadKey(); } } }
升级版:
using System; namespace EventDemo2 { class Program { public static void Main(string[] args) { //实例化对象 Mom mom = new Mom(); Dad dad = new Dad(); Child child = new Child(); //将爸爸和孩子的Eat方法注册到妈妈的Eat事件 //订阅妈妈开饭的消息 mom.Eat += dad.Eat; mom.Eat += child.Eat; //调用妈妈的Cook事件 mom.Cook(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } } public class Mom { //定义Eat事件,用于发布吃饭消息 public event Action Eat; public void Cook() { Console.WriteLine("妈妈 : 饭好了"); //饭好了,发布吃饭消息 Eat?.Invoke(); } } public class Dad { public void Eat() { //爸爸去吃饭 Console.WriteLine("爸爸 : 吃饭了。"); } } public class Child { public void Eat() { //熊孩子LOL呢,打完再吃 Console.WriteLine("孩子 : 打完这局再吃。"); } } }
专业版:
using System; namespace EventDemo3 { public class CustomEventArgs : EventArgs { public CustomEventArgs(string s) { message = s; } private string message; public string Message { get { return message; } set { message = value; } } } // 发布者 class Publisher { // 使用 EventHandler<T> 声明事件 public event EventHandler<CustomEventArgs> RaiseCustomEvent; public void DoSomething() { // 可以在这里处理一些有用的事,然后触发事件 // 也可以在一些代码之前触发事件 OnRaiseCustomEvent(new CustomEventArgs("Did something")); } // 把事件调用包含在一个 protected virtual 方法中,这样可以允许 // 子类重写事件调用 protected virtual void OnRaiseCustomEvent(CustomEventArgs e) { // 使用一个事件临时的引用,可以避免一种可能的竞争条件: // 如果最后一个订阅者在 null 检查之后,事件触发之前突然 // 取消事件订阅 EventHandler<CustomEventArgs> handler = RaiseCustomEvent; // 如果没有订阅者,handler 将会是 null if (handler != null) { // 格式化事件参数中的额外信息 e.Message += $" at {DateTime.Now}"; // 使用 () 操作符触发事件 handler(this, e); } } } // 订阅者 class Subscriber { private string id; public Subscriber(string ID, Publisher pub) { id = ID; // 使用 C# 2.0 语法订阅事件 pub.RaiseCustomEvent += HandleCustomEvent; } // 定义事件触发时要进行的操作 void HandleCustomEvent(object sender, CustomEventArgs e) { Console.WriteLine(id + " received this message: {0}", e.Message); } } class Program { static void Main(string[] args) { Publisher pub = new Publisher(); Subscriber sub1 = new Subscriber("sub1", pub); Subscriber sub2 = new Subscriber("sub2", pub); // 调用触发事件的方法 pub.DoSomething(); // 保持控制台一直打开 Console.WriteLine("Press Enter to close this window."); Console.ReadLine(); } } }
标签:Case,Console,C#,void,Eat,public,class,new,Event From: https://www.cnblogs.com/exesoft/p/16917137.html