C#基础 概念之委托,事件(面试:猫叫了,老鼠跑了主人醒了 )其二:封装

.net 委托,事件(面试:猫叫了,老鼠跑了主人醒了 )其一
.net 委托,事件(面试:猫叫了,老鼠跑了主人醒了 )其二
.net 委托,事件(面试:猫叫了,老鼠跑了主人醒了 )其三
源代码

事件

事件基于委托,为委托提供了一种发布/订阅机制(观察者模式)
事件必须包含三部分:
事件的订阅者
事件的触发者/发布者
订阅者和触发者之间的数据传输通道

事件(event)的本质:事件本身其实就是一个委托链

事件与委托链的异同:

相同

  1. 事件的本质就是委托链,可以进行委托链的增加和移除

不同

  1. 事件本身时私有的,只能通过+=和-=访问
  2. 委托链可以随时进行增加和删除,也可以随时进行赋值(此为委托链的弊端:委托随时可以被篡改)
  3. 事件只能增加相同标签的动作,但是委托链可以增加不同标签的动作

问题:猫叫了一声,老鼠们跑了,主人醒了

事件二探:封装

核心:事件应该由事件的发布者触发

订阅者:
用于在事件触发后,做出对应的响应行为
此处传入的ifCatMiao就是事件的结果,WakeUp就是响应行为

    /// <summary>
    /// 订阅者 老鼠
    /// </summary>
    public class Master
    {
        public void WakeUp(bool ifCatMiao)
        {
            System.Diagnostics.Debug.WriteLine("主人醒了");
        }
    }

    /// <summary>
    /// 订阅者 主人
    /// </summary>
    public class Mouse
    {
        public void RunAway(bool ifCatMiao)
        {
            System.Diagnostics.Debug.WriteLine("老鼠跑");
        }
    }

发布者
此处发布者封装了事件的触发

    /// <summary>
    /// 发布者猫,把事件放在发布者猫内部,并提供执行语句
    /// 重要:事件应该由事件的发布者触发
    /// </summary>
    public class Cat2
    {
        public delegate void IfMiaoHandler(bool bol);

        public static event IfMiaoHandler IfMiao;


        public static bool Miao()
        {
            //var ifMiao = (new Random()).Next(0, 1)==1;
            //if (ifMiao)
            //{
            //    System.Diagnostics.Debug.WriteLine("猫叫了");
            //}else
            //{
            //    System.Diagnostics.Debug.WriteLine("猫睡着了");
            //}
            System.Diagnostics.Debug.WriteLine("猫叫了");
            return true;
        }
        public static void Excute(bool bol)
        {
            //事件在对象之内
            IfMiao(bol);
        }
    }

管道:

        public void Second()
        {
            var mouses = new List<Mouse>() { new Mouse(), new Mouse(), new Mouse() };

            var master = new Master();

            //添加老鼠的逃跑
            foreach (var mouse in mouses)
            {
                Cat2.IfMiao += mouse.RunAway;
            }

            //添加主任的惊醒
            Cat2.IfMiao += master.WakeUp;

            //直接激发事件或报错,在事件所处的对象之外,事件只能出现在+=,-=之外
            //Cat2.IfMiao(Cat2.Miao());
            Cat2.Excute(Cat2.Miao());
        }

此处的主要作用是实现了:
事件应该由事件的发布者触发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值