在我的个人项目中,我从未使用过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
}
}
Run Code Online (Sandbox Code Playgroud)
有道理,对吗?球员没有健康,所以我打电话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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
而现在,当我创建新玩家时,我可以为其分配任何方法DieHandler:
Player player = new Player("Joe");
player.Die += Client.Players.PlayerDie;
Player npc = new Player("Cookie Monster");
npc.Die += Client.Npcs.NpcDie;
Run Code Online (Sandbox Code Playgroud)
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)
{
}
Run Code Online (Sandbox Code Playgroud)
正如您现在所看到的,我们已经灵活地将任何"匹配"方法附加到我们的Die处理程序.我们发送Player对象作为sender属性和EventArgse中定义的任何对象.我们可以利用EventArgs发送附加信息,即- e.NameOfTheKiller,e.LastHitAtTime等等等等.最好的事情是,你可以定义自己的EventArgs类,因此您可以在您的产卵事件发送其他信息.
哇...这个帖子很长.我希望你现在明白.
所以再次 - 当你想要"告知外部世界"你的对象的某个特定状态并适当地处理这个改变时,到处使用事件.它将使您的代码更灵活,更易于维护.