这一定是一个非常常见的场景,已经有很多关于它的文章,希望甚至是一个非常好的模式。我有一个域模型,其中一个自定义容器包含实体。例如(为简洁起见,排除了属性和接口):
class Entity
{
public int Id;
public EntityContainer ParentContainer;
}
class EntityContainer
{
public int Id;
public IList<Entity> Entities = new List<Entity>();
public void AddEntity(Entity entity)
{
entity.ParentContainer = this;
Entities.Add(entity);
}
}
class Main
{
public Main()
{
Entity entity1 = new Entity();
Entity entity2 = new Entity();
EntityContainer entityContainer = new EntityContainer();
entityContainer.AddEntity(entity1);
entityContainer.AddEntity(entity2);
// Can now traverse graph easily, e.g.
Console.WriteLine("entity1's parent container ID = " + entity1.ParentContainer.Id);
Console.WriteLine("Container contains at least this entity ID: " + entityContainer.Entities[0].Id);
}
}
我现在可以很容易地遍历我的对象图,但已经创建了一个循环引用。你会创建第三种类型来分离依赖关系吗?
提前谢谢
最佳答案
循环引用本身没有问题,它们在.NET框架中被广泛使用,例如xmlnode.ownerdocument、control.parent。
如果需要遍历树,则可以使用反向引用。
在com中,循环引用很棘手,因为如果您将容器及其所有子容器设置为空,则对象将不会被正确清理,因为子容器仍保留对父容器的引用。但是.NET垃圾回收在实现方式上没有问题。