Csharp/C#教程:.NET是否删除父类会将子项变为“垃圾”?分享


.NET是否删除父类会将子项变为“垃圾”?

假设您有一个Collection ,并且您即将删除一个项目。 B的实例从A的实例引用,并引用C的实例,如第一张图所示:

图A https://sofzh.miximages.com/c%23/240wuqh.png

现在,由于有一个指向B的引用,因此毫无疑问该对象被“删除”或被垃圾收集。 它只是从集合中删除,就像这样,对吗?

图B https://sofzh.miximages.com/c%23/4uxnp3.png

现在,让我们有一个Collection具有与以前相同的引用层次结构,让我们删除A的实例。

图C https://sofzh.miximages.com/c%23/1zd93dt.png

如果没有其他对A引用,不仅它从集合中删除,它被标记为垃圾。 我对吗? 那么BC呢? 它们是否也成为垃圾,除非B引用C实例,否则没有其他引用?

这是我所面临的简化。 我想从集合中删除一个A实例,我想确保BC一起使用它。 在我不再收集A的地方,所有仍然活着的“孩子”对我来说都是memory leaks。

当我看到我制作的这些照片时,它似乎太愚蠢了。 但我的情况有点不那么微不足道 。 它看起来像这样:

图4 https://sofzh.miximages.com/c%23/2ymhlq0.png

我有一个A ViewModel实例的集合。 当我删除一个时,我需要其他所有内容。 如果所涉及的任何实例都没有其他“外部参考”(基本上,没有其他箭头指向图片外部),被移除的“ViewModel”实例是否会将所有孩子带走? 如果是这样,是否有任何“陷阱”可以使这种简化误导? 如果我完全错了,为什么? ?

感谢您阅读这篇文章!

如果所涉及的任何实例都没有其他“外部参考”(基本上,没有其他箭头指向图片外部),被移除的“ViewModel”实例是否会将所有孩子带走?

是的,如果您的代码没有引用给孩子,它将有资格进行垃圾收集,最终应该被收集。

如果没有其他对A的引用,不仅它从集合中删除,它被标记为垃圾。 我对吗?

这实际上并不是这样的。 GC不会“跟踪垃圾” – 而是从当前正在执行的代码中检查所有对象引用,然后走出去查找当前“活动”的引用。 此时遗留的任何东西都不存在,然后才有资格收集。 如果在图表中达到“B”或“C”的唯一方法是通过“A”的实例,并从集合中删除“A”,则所有这些都将符合GC的条件,并且可以在下一个合适的GC收集。

上述就是C#学习教程:.NET是否删除父类会将子项变为“垃圾”?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/955013.html

(0)
上一篇 2021年11月21日
下一篇 2021年11月21日

精彩推荐