防止不可变的对象重复项

问题描述 投票:0回答:1

对于游戏,我正在创建许多确定NPC例程的不可变对象。一个节点对象更改x和z的值,一个对象更改y的值,一个对象更改角度,依此类推。我为他们开设了十二个不同的班级。这些对象是NPC所走路径的网络。这些对象还捆绑成一个更大的对象,即节点。这个节点在一段时间内一直是NPC的操作者,直到分配了下一个节点。

我希望最终有数千个节点。但是我确信这些节点中的对象通常是某些其他节点中对象的重复。

为了保持此系统在内存中的占用空间小,我希望每帧将y值更改5的对象与其他每个具有将y值更改5的对象的节点中的对象相同。我想要每个节点都引用相同的对象。

我尝试通过将这些对象的构造函数设置为private并使用一种方法来返回该对象(如果参数是唯一的,或者返回一个在创建过程中具有相同参数的现有对象的方法。)>

当我为每个要防止具有相同对象的类提供一个LinkedList时,我已经成功完成了。这是一个看起来像的例子:

private class NodeEndTime : NodeEnd
{
   //attributes
   private readonly int dayTime;

   //constructor
   private NodeEndTime(int dayTime) { this.dayTime = dayTime; }

   //methods (only the one relevant for the question)
   public static NodeEndTime Constructor(int dayTime, LinkedList<NodeEndTime> list)
   {
      foreach (NodeEndTime node in list)
      {
         if (node.dayTime == dayTime) return node;
      }
      NodeEndTime fresh = new NodeEndTime(dayTime);
      list.AddLast(fresh);
      return fresh;
   }
}

我对此不满意的是,我需要每个类都有唯一的LinkedList。我想要的是所有对象的列表。但是我不知道该怎么做。一个想法是拥有一个唯一列表列表,该列表在运行时将所需列表创建为属性(如果尚不存在),并完成自动访问正确列表的工作。但是我也不知道该怎么做。

这里有什么干净的解决方案?我怀疑仿制药会有所帮助,但我对它们的经验不足,无法找到适合他们的方法。我还需要注意,这些列表仅在加载过程中存在。创建的对象以NPC可用的不同结构存在。因此,将它们包括在类中不是一个选择。除非我可以在加载后以某种方式删除它们。

对于游戏,我正在创建许多确定NPC例程的不可变对象。一个节点对象更改x和z的值,一个对象更改y的值,一个对象更改角度,依此类推。我有一个...

c# list immutability
1个回答
0
投票

为此,您需要一个带有私有构造函数的类,该类可以创建某种密钥来唯一标识对象。然后可以将其存储在Dictionary中,并在每次尝试创建新实例时进行查询。如果已经存在具有相同键的实例,则返回该实例,否则创建一个新实例并将其添加到字典中。通过这样的操作,您调用Get,将获得现有副本或新实例。

© www.soinside.com 2019 - 2024. All rights reserved.