当前位置:  开发笔记 > 编程语言 > 正文

为何以及何时使用事件?

如何解决《为何以及何时使用事件?》经验,为你挑选了1个好方法。

在我的个人项目中,我从未使用过Events.I从未感觉到它是必要的.特别是使用事件会产生一些关于限制具有相同参数的方法的问题,这就是我没有使用它的原因.使用它的好处是什么?什么时候和我们需要的地方?

编辑:对于封闭源库,使用事件更多?因为我们无法将任何方法附加到现有的闭源方法中,所以Events会帮助我们解决这个问题吗?因为在开源中,我们可以轻松地将我们的方法添加到方法的末尾.



1> rochal..:

哦,我遇到了同样的问题.我理解事件的概念,因为我在JavaScript中大量使用它们,但我无法证明在C#应用程序中使用事件是正确的.我的意思是,我使用过服务器OnClick等,但我无法理解为什么我会在其他任何地方使用事件.

实际上有趣的故事,因为当我在我的ORPG游戏上工作时,我学到了很多东西.考虑以下代码:

class Player
{
    private int health;
    public int Health
    {
        get
        {
            if (health <= 0)
            {
                Die();
            }

            return health;

        }

        set
        {
            health = value;
        }
    }

    public void Die()
    {
        // OMG I DIED, Call bunch of other methods:
        // RemoveFromMap();
        // DropEquipment(); etc
    }
}

有道理,对吗?球员没有健康,所以我打电话Die().Die方法正在做它应该做的任何事情 - 杀死玩家.

当我想在ORPG游戏的服务器和客户端应用程序中重用此类时,我的问题就出现了.很容易注意到该Die()方法应该做不同的事情,取决于执行'杀戮'的位置 - 在服务器上它应该更新各种不同的数据 - 在客户端它应该用图形做一些事情.

另外 - 如果我想让Die()方法做不同的事情,取决于播放器的类型怎么办?与计算机/人工智能控制的玩家(NPC)相比,所有用户控制的玩家在被杀后应该做不同的事情.

所以,我被迫使用事件:

class Player
{
    public event DieHandler Die;
    public delegate void DieHandler(Player sender, EventArgs e);
    public virtual void OnDie(EventArgs e)
    {
        if (Die != null)
            Die(this, e);
    }

    private int health;
    public int Health
    {
        get
        {
            if (health <= 0)
            {
                onDie(new EventArgs());
            }

            return health;

        }

        set
        {
            health = value;
        }
    }
}

而现在,当我创建新玩家时,我可以为其分配任何方法DieHandler:

Player player = new Player("Joe");
player.Die += Client.Players.PlayerDie;

Player npc = new Player("Cookie Monster");
npc.Die += Client.Npcs.NpcDie;

where Client.Npcs.DieClient.Players.Die是以下之一:

public void NpcDie(Player sender, EventArgs e)
{
    //who hoo, I can be implemented differently
    //I can even check if sender.Health <= 0
}

public void PlayerDie(Player sender, EventArgs e)
{
}

正如您现在所看到的,我们已经灵活地将任何"匹配"方法附加到我们的Die处理程序.我们发送Player对象作为sender属性和EventArgse中定义的任何对象.我们可以利用EventArgs发送附加信息,即- e.NameOfTheKiller,e.LastHitAtTime等等等等.最好的事情是,你可以定义自己的EventArgs类,因此您可以在您的产卵事件发送其他信息.

哇...这个帖子很长.我希望你现在明白.

所以再次 - 当你想要"告知外部世界"你的对象的某个特定状态并适当地处理这个改变时,到处使用事件.它将使您的代码更灵活,更易于维护.

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有