在我的个人项目中,我从未使用过Events.I从未感觉到它是必要的.特别是使用事件会产生一些关于限制具有相同参数的方法的问题,这就是我没有使用它的原因.使用它的好处是什么?什么时候和我们需要的地方?
编辑:对于封闭源库,使用事件更多?因为我们无法将任何方法附加到现有的闭源方法中,所以Events会帮助我们解决这个问题吗?因为在开源中,我们可以轻松地将我们的方法添加到方法的末尾.
哦,我遇到了同样的问题.我理解事件的概念,因为我在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.Die
和Client.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属性和EventArgs
e中定义的任何对象.我们可以利用EventArgs
发送附加信息,即- e.NameOfTheKiller
,e.LastHitAtTime
等等等等.最好的事情是,你可以定义自己的EventArgs
类,因此您可以在您的产卵事件发送其他信息.
哇...这个帖子很长.我希望你现在明白.
所以再次 - 当你想要"告知外部世界"你的对象的某个特定状态并适当地处理这个改变时,到处使用事件.它将使您的代码更灵活,更易于维护.