e媒网络

一切皆可能 e媒网络 http://www.eMay.net

博客园 首页 新随笔 联系 订阅 管理

基本版:

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();
        }
    }
}

 

posted on 2022-11-23 08:39  e媒网络技术团队  阅读(26)  评论(0编辑  收藏  举报