我有List<Character> citizens
。
公民有各种财产,最重要的是:
public string firstname;
public Dictionary<Character, Relationship> relationships { get; set; }
...
公民可以在创建后成为,例如Trader : Character
。
因此,在我的公民名单中,我想将一个字符的引用替换为一个交易者。
我阅读并理解有关向下转换的答案。所以我将做构造函数方法:
public Trader(Character c)
{
firstname = c.firstname;
relationships = c.relationships;
...
}
然后我想替换旧角色的引用并使用这个花哨的新交易者:
citizens.Remove(old);
citizens.Add(fancyTrader);
我关心的是对关系字典的引用,这不仅会导致旧Character
对象永远挂起,这意味着这个人在内存中有两个副本,旧的永远不会被垃圾收集远?
我很担心,因为我有成千上万的这些公民。
答案 0 :(得分:2)
解决此问题的一种方法是使用组合代替继承。考虑将您的Character
信息抽象为多个部分。 Character
类保存名称数据和关系,而Role
类保存他们的&#34;作业&#34;。 Trader
将是Role
的子类,而Character
将为该公民的角色拥有一个属性(如果他们可以拥有多个角色,甚至可以包含一个角色列表
这为您提供了很大的灵活性,并且还可以防止您的引用在角色更改角色时变得混乱。
答案 1 :(得分:0)
是的,你可能在这种情况下会出现内存泄漏,但是如果你完全小心自己清理后你会没事(这与转发无关)。
向下转换的主要“陷阱”是尝试对付实际上并不是你要投射到的类型,这是一个运行时错误(不理想)。使用您的方法,您需要确保您了解您正在执行浅副本以及可能引发的错误。
我会使用分析器运行程序一段时间,确保您没有越来越多的引用并使用它来查看是否有问题。在Citizen
上使用“Dispose”方法可以在不再需要该对象时清理关系字典,这将大大有助于解决任何此类问题。