委托和事件的应用场景

C#委托和事件的应用场景

接触过委托和事件的人都知道,它们的语法都很简单,真正的难点是在什么场景中利用它们的特性来使用它。下面我希望通过我分析下面的这个案例可以读者有一些启发。有错误的地方还望指出,一起进步,谢谢!

假设你在一天的某个心情好的时刻会玩王者荣耀,你的5个寝室友(A,B,C,D,E…)将在一起打赌,如果你赢了,5个寝室友悄悄各帮你写一门作业,如果你输了你的室友会对你发出嘲讽。
有些同学可能会觉得这个题目很简单,不就是if判断吗。
If(心情好,在玩游戏)
{
If(赢)
{
A帮你写英语作业
B帮你写语文作业
C帮你写数文作业
D帮你写化学作业
E帮你写英语作业
}
If(输)
{
A发出嘲讽
B发出嘲讽
C发出嘲讽
D发出嘲讽
E发出嘲讽
}
}

然而,真的这么简单吗?首先你怎么知道你的心情在一天的哪个时刻好,而且刚好在那个时刻想玩游戏,并且你的室友知道你在玩游戏, 换句话来所我们不知道在哪里插入这段代码。难道你的室友一直用while循环做上面的判断,显然这不合适,因为你的室友要吃饭睡觉等,而且如果有更多的人参与这个打赌,每个人都有自己相应的方法,那么我们的程序将需要不断的进行扩展,而我们的委托和事件其中一个功能就是解决上述情况。

首先定义一个MySelf类表示你自己。里面有一个方法表示你在玩游戏,还有两个事件,一个是玩游戏赢了的事件,一个是玩游戏输了的事件。

class MySelf
    {
        public delegate void Play();
        public event Play WinOther;//事件:赢了游戏
        public event Play FailOther;//事件:输掉了游戏
        Random random=new Random();
    
        //玩游戏
        public void PlayComputerGame()
        {
            //用游戏生成
            if (random.Next(0, 2) == 1)
            {
                WinOther();               
            }
            else
            {
                FailOther();
            }          
        }
}

然后你在定义一个Other类表示你室友,里面有一些他的基本信息,比如名字name,还有打赌输了之后要帮你写的课程名couse,以及打赌输了要做的事情CaoFen()和打赌赢了要做的事情WriteHomeWork()。还有这个对象实例的时候我们还要传入他需要观察的对象mySelf,以便他可以订阅被观察者(我)相应的事件。也就是这两行代码:

mySelf.WinOther += WriteHomeWork;
mySelf.FailOther += CaoFen;

class Other
    {
        string name;
        string couse;
        public Other(string name, string couse,MySelf mySelf)
        {
            this.name = name;
            this.couse = couse;
            mySelf.WinOther += WriteHomeWork;
            mySelf.FailOther += CaoFen;
        }
        public void WriteHomeWork()
        {
            Console.WriteLine(name+"说"+ "我输了!我给你写"+ couse+"作业");
        }

        public void CaoFen()
        {
            Console.WriteLine(name + "说:垃圾!你真菜");
        }
}

最后我们实例化自己,然后再创造几个室友,我们知道每创造一个室友的时候他都会自动注册相应事件。然后当我玩游戏就会掉用相关事件里面的方法。
在现实场景中就相当于我的室友再我的手机里的王者荣耀APP里装了一个触发器,平常他们该该该干嘛就干嘛,如果我突然心情好玩游戏,触发器触发,给他们发送一个信号,然后他们就会默默观察我,如果我输了,他们就会嘲讽我,赢了的话就会悄悄各帮我写一门作业。而上面我们用While加if的那种模式就是他们不管吃饭,还是睡觉他们都一直盯着我。这两者其中的利害关系一目了然。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 委托的应用场景
{
    class Program
    {
        static void Main(string[] args)
        {
            MySelf mySelf = new MySelf();
            Other other1 = new Other("室友1", "语文", mySelf);
            Other other2 = new Other("室友2", "数学", mySelf);
            Other other4 = new Other("室友3", "英语", mySelf);
            Other other5 = new Other("室友4", "MAYA", mySelf);
            Other other6 = new Other("室友5", "化学", mySelf);
            mySelf.PlayComputerGame();
        }
    }
}

简单的说,某件事发生了,你必须要作出响应。你不能预测事件发生的顺序。只能等事件发生,再作出相应的动作来处理。触发事件的类本身对怎样处理事件不感兴趣。响应类作出合适的响应。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值