C#中如何释放一个被其它对象所引用的实例?

时间:2021-11-14 05:20:33
打个比方,我现在有个自己实现的树状结构,每个节点都有指向父亲的parent引用,还有指向所有孩子的children引用。如果现在我想要去释放销毁这个树的根结点但是保留一些子节点,仅仅执行treeRoot = null的话,由于子节点还有指向treeRoot的引用,这个根结点应该是不会被DotNet的GC自动回收的。这里如果我想要删除treeRoot,需要自己实现一个方法将所有子节点child.parent = null好呢,还是将parent设置城一个弱引用好呢?如果使用第一个方法,是继承IDispose实现Dispose方法还是自己实现一个Release方法比较好?如果使用弱引用,可否简单的介绍一下弱引用,它的缺点和优点在哪里?

在此先谢过~

7 个解决方案

#1


取决于你程序的规模。

你可以设计父子依赖方向或者双向依赖。

没有绝对的好或者不好。

#2


如果数据量很大,可以考虑持久化,并且使用lazyload。

#3


引用 1 楼 caozhy 的回复:
取决于你程序的规模。

你可以设计父子依赖方向或者双向依赖。

没有绝对的好或者不好。
没有绝对的好或者不好。

#4


和lazyload关系倒不是很大。现在的设计主要是因为子节点需要实现一个从父节点里删除自己的操作,所以子节点必须有一个对父节点的引用,这样一旦父节点被释放了子节点必须立刻接到通知把parent设置成null,这个过程需要手动去完成,如果不去这样做的话反而会因为子节点引用了父节点导致父节点不能被释放。所以我就想了解一下自己实现一个release方法或者用弱引用的方法哪个更安全些?

#5


正因为没有绝对的好与不好,所以我想知道每种方法的优势劣势分别是什么呀。

#6


up,求高人解答……

#7


你先把你的功能1.2,3,4列出来,对比下,优劣自明。

#1


取决于你程序的规模。

你可以设计父子依赖方向或者双向依赖。

没有绝对的好或者不好。

#2


如果数据量很大,可以考虑持久化,并且使用lazyload。

#3


引用 1 楼 caozhy 的回复:
取决于你程序的规模。

你可以设计父子依赖方向或者双向依赖。

没有绝对的好或者不好。
没有绝对的好或者不好。

#4


和lazyload关系倒不是很大。现在的设计主要是因为子节点需要实现一个从父节点里删除自己的操作,所以子节点必须有一个对父节点的引用,这样一旦父节点被释放了子节点必须立刻接到通知把parent设置成null,这个过程需要手动去完成,如果不去这样做的话反而会因为子节点引用了父节点导致父节点不能被释放。所以我就想了解一下自己实现一个release方法或者用弱引用的方法哪个更安全些?

#5


正因为没有绝对的好与不好,所以我想知道每种方法的优势劣势分别是什么呀。

#6


up,求高人解答……

#7


你先把你的功能1.2,3,4列出来,对比下,优劣自明。