首页 > 编程语言 >[C#]Event相关的三个典型Case收录.

[C#]Event相关的三个典型Case收录.

时间:2022-11-23 09:02:47浏览次数:43  
标签:Case Console C# void Eat public class new Event

基本版:

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

相关文章

  • laravel composer require require-dev和APP_ENV的使用场景
    2022年11月22日12:25:42composerrequirerequire-dev的使用场景官方文档:https://getcomposer.org/doc/04-schema.md#requirerequire此包所需的包映射。除非可以满足......
  • ClickHouse 单表查询优化
    1、Prewhere替代wherePrewhere和where语句的作用相同,用来过滤数据。不同之处在于prewhere只支持*MergeTree族系列引擎的表,首先会读取指定的列数据,来判断数据过滤,等待数......
  • 如何利用C++使Windows蓝屏
    如何利用C++使Windows蓝屏虽说windows非常强大,但是使它蓝屏也非常简单:如果你想让Windows蓝屏,你一定会在运行框里输入:cmd/cfor/f%Iin('wmicprocessgetName')d......
  • Spring Security(3)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 前面运行写好的代码之所以没有任何显示,是因为还没有对SpringSecurity进行配置,当然啥也不显示了。这就好比你坐在车上,却......
  • 通过docker构建永不宕机的监控探针
    1、容器技术发展的几个阶段1.1docker的由来,构建一次,到处运行1.2docker与传统虚拟机性能对比1.3docker与传统虚拟机架构对比1.4如何理解Docker1.5容器技术发展的......
  • [跨域问题]:Response to preflight request doesn't pass access control check: It do
    先将注意力放在报错信息上:“Responsetopreflightrequestdoesn'tpassaccesscontrolcheck:ItdoesnothaveHTTPokstatus.”首先什么是preflightrequest?......
  • 什么是BFC
    BFC是什么:   BFC是块级化上下文简单来说BFC是一个完全独立的空间,就是让空间里的子元素不会影响到外面的布局触发BFC的条件: float:left/right/buttom/top......
  • NopCommerce的页面展示
    MVC架构,首先”急功近利“选择V下手,在路由中可以看到路由配置中的View,找到首页ViewNop.Web\Views\Home\Index.cshtml@{Layout="~/Views/Shared/_ColumnsThree.cshtml......
  • NopCommerce多语言的实现
    通过语言包xml文件导入导出语言字符串数据库方面,以下数据表:LanguageLocaleStringResourceLocalizedProperty接口IWorkContext真正实现类是Nop.Web.Framework.WebWorkC......
  • RISC-V-HPC市场-汽车电动化分析
    RISC-V-HPC市场-汽车电动化分析参考文献链接https://mp.weixin.qq.com/s/abQArnxisYOZtWrFhKIkgghttps://mp.weixin.qq.com/s/Q2WHzzRJhzNPemzjHPgzOghttps://mp.weixi......