C# 在C语言中如何正确地自动更新一对多的双向关系#

C# 在C语言中如何正确地自动更新一对多的双向关系#,c#,game-engine,bidirectional-relation,C#,Game Engine,Bidirectional Relation,在示例游戏引擎服务器中,游戏世界可以由世界对象表示。游戏可能有多个游戏世界,一个玩家在一个世界中只需要接收该世界中单位的位置数据 class World { public List<Unit> Units { get; set; } } 这适用于查找,但当程序员不知道对象之间的关系时,更改数据很快就会出现问题,因此我将World中的Units更改为只读,并在Unit中包含以下代码 public virtual World World { get { return _

在示例游戏引擎服务器中,游戏世界可以由世界对象表示。游戏可能有多个游戏世界,一个玩家在一个世界中只需要接收该世界中单位的位置数据

class World
{
    public List<Unit> Units { get; set; }
}
这适用于查找,但当程序员不知道对象之间的关系时,更改数据很快就会出现问题,因此我将
World
中的
Units
更改为只读,并在
Unit
中包含以下代码

public virtual World World
{
    get { return _world; }
    set
    {
        // Unit must always be in a world
        Contract.Requires<ArgumentNullException>(value != null);

        // If already this, don't do anything
        if (value == _world) return;

        var oldWorld = _world;
        _world = value;

        if(oldWorld != null) oldWorld.UpdateUnitEntry(this);
        _world.UpdateUnitEntry(this);
    }
}
公共虚拟世界
{
获取{return\u world;}
设置
{
//单位必须永远在一个世界里
Contract.Requires(值!=null);
//如果已经这样了,什么都不要做
如果(值==_world)返回;
var oldWorld=_world;
_世界=价值;
如果(oldWorld!=null)oldWorld.UpdateUnitEntry(此);
_world.UpdateUnitEntry(本);
}
}

这是可行的,但感觉有更好的方法。特别是当我添加更多需要以相同方式链接的内容时(一个
World
也有
Structure
s和
Player
s),大量重复的功能出现了。有没有一种更好的方法来实现这种一对多关系,而不需要手动更新两个方面?之类的语言,C++没有这样的SopiHistar引用管理和GC,这样循环引用是一个问题(例如SyrdPtR)。 例如,游戏状态的序列化也是一个问题

这使我相信,可能有更好的办法来处理这一问题。 例如,这些单位真的需要了解他们的世界吗? 也许看看那些让你觉得你需要的代码,也许你可以改变它,让它不再需要了

所以,也许可以实现一个实体管理系统,只通过抽象ID或句柄引用游戏实体。在对后面的对象执行操作之前解析ID/句柄,但不要让实体保存对另一个实体的引用。 如果你发现自己想要序列化游戏的状态,这也会有很大帮助

否则:

你所做的并不是完全错误的。如果它起作用了,没有太大的痛苦,就保持这样。

也许吧?
public virtual World World
{
    get { return _world; }
    set
    {
        // Unit must always be in a world
        Contract.Requires<ArgumentNullException>(value != null);

        // If already this, don't do anything
        if (value == _world) return;

        var oldWorld = _world;
        _world = value;

        if(oldWorld != null) oldWorld.UpdateUnitEntry(this);
        _world.UpdateUnitEntry(this);
    }
}