gpt4 book ai didi

c# - .NET 删除父类会将子类变成 "garbage"吗?

转载 作者:太空狗 更新时间:2023-10-29 21:13:07 26 4
gpt4 key购买 nike

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

Figure A

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

Figure B

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

Figure C

如果没有其他引用 A ,它不仅会从集合中移除,还会被标记为垃圾。我对吗?那么B呢?和 C ?如果除了 B 没有其他引用,它们也会变成垃圾吗?引用 C 的实例?

这是对我所面临的问题的简化。 我想删除一个 A来自集合的实例,我想确保 BC A 的位置。不再在我的收藏中,所有还活着的“ child ”对我来说都是内存泄漏。

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

figure 4

  • 图中Model层为黄色,ViewModel层为绿色
  • “A ViewModel”类引用了它的 A Model
  • A Model收藏了 B Model实例(BA 的子代,在模型层和 View 模型层)
  • 每个B Model “知道它的父级”——引用它的父级“模型”实例
  • 回到 VM 层,“A ViewModel”包含“B ViemModel”项的集合
  • 作为任何好的 ViewModel,“B ViewModel”引用“B Model”

我收藏了这些 A ViewModel实例。当我删除一个时,我需要其他所有东西来配合它。如果没有对所涉及的任何实例的其他“外部引用”(基本上,没有其他箭头指向图片外部),删除的“A ViewModel”实例是否会带走所有子实例?如果是这样,是否有任何“陷阱”会使这种简化产生误导?如果我完全错了,为什么? :)

感谢您阅读到这里!

最佳答案

Provided there's no other "outside reference" to any of the instances involved (basically, no other arrow pointing coming in from outside of the picture), will the removed 'A ViewModel' instance take all the children with it?

是的,只要您的代码中没有对子项的引用,它将有资格进行垃圾回收,并且最终应该被回收。

If there's no other reference to A, not only it gets removed from the collection, it is marked as garbage. Am I right?

这实际上不是它的工作原理。 GC 不会“跟踪垃圾”——相反,它会检查当前正在执行的代码中的所有对象引用,然后走出去寻找当前“有效”的引用。那时剩下的任何东西都没有生命,然后才有资格收集。如果在你的图中到达“B”或“C”的唯一方法是通过“A”的那个实例,并且你从集合中删除“A”,那么所有这些都将有资格获得 GC 并在下一个适当的 GC 收集。

关于c# - .NET 删除父类会将子类变成 "garbage"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19779864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com