gpt4 book ai didi

c# - 一个对象订阅自己的事件改变内部数据可以吗?

转载 作者:行者123 更新时间:2023-11-30 16:39:58 25 4
gpt4 key购买 nike

如题所说,一个对象订阅自己的事件合理吗?

public class Player
{
private int team;

public Action<int> TeamChanged { get; set; }

public Player(int startingTeam)
{
team = startingTeam;

TeamChanged += OnTeamChanged; // subscribe to my own event
}

private void OnTeamChanged(int newTeam)
{
team = newTeam;
}
}

// later during the match:
public void ShuffleTeam()
{
player.TeamChanged(GetRandomTeam());
}

它似乎比调用事件本身的额外 ChangeTeam() 函数简洁得多。但出于某种原因也感觉不对。

最佳答案

您似乎在颠倒地理解事件。当事情发生时,事件就会被触发,你不会触发事件来让事情发生;你调用一个方法。

在您的情况下,当 Team 属性更改时,您将触发该事件。您不会触发事件来改变团队。你需要换团队?实现一个公共(public)方法或属性 setter 来精确地执行此操作,让任何想要改变团队的人都可以改变。

此外,将事件声明为事件,而不是作为委托(delegate)。解决问题的正确方法是:

public class Player
{
public event Action<int> TeamChanged;

private int team;
public int Team
{
get { return team; }
set
{
if (value != team) {
team = value;
OnTeamChanged(team); }
}
}

public Player(int startingTeam)
{
team = startingTeam;
}

private void OnTeamChanged(int newTeam)
{
TeamChanged?.Invoke(team);
}
}

现在,任何需要对球员更换球队采取行动的消费者都会订阅该事件。

您也可以跳过整个 OnTeamChanged 业务并直接在属性 setter 中引发事件,除非您正在考虑某种继承模型,在这种情况下该方法应该被保护.

长话短说,订阅自己的事件毫无意义。事件驱动设计非常有用,因为您无法控制或知道事件何时触发;用户按下鼠标按钮或关闭应用程序。对于在类本身中声明的事件,您总是知道它何时会被引发,您必须在某处实现调用,订阅它是荒谬的。

关于c# - 一个对象订阅自己的事件改变内部数据可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52174064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com