代码之家  ›  专栏  ›  技术社区  ›  Brett Allen

如果将事件附加到表单处理程序,而不删除它,那么在表单关闭时是否可以对表单和对象进行垃圾收集?

  •  0
  • Brett Allen  · 技术社区  · 15 年前

    下面是一个场景。

    现在,当垃圾收集器进行循环时会发生什么?

    因为FormA应该被处理,但是ClassA引用了FormA。

    类别A仍在FormA范围内引用。

    那么这是如何处理的呢?

    1. NET处理表单关闭的方式是,它删除了对其作用域中对象的所有引用,从而删除了对允许收集ClassA的ClassA的引用,然后FormA不再被ClassA引用,因此可以收集FormA?

    2. .NET拒绝收集FormA,因为它被ClassA引用,因此也不收集ClassA?

    我的理解是1或2是正确的,我倾向于2,但不要怀疑1或3是可能的。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Bradley Grainger    15 年前

    如果ClassA引用了FormA(通过事件处理程序),FormA引用了ClassA(通过将其作为字段保存),但是 没有别的了 如果有对这些对象的引用,GC将检测循环引用并收集它们。

    要了解更多信息,我建议 Garbage Collector Basics and Performance Hints .

        2
  •  0
  •   Josh Lee ZZ Coder    15 年前

    您所描述的本质上是引用计数的问题。我认为.NET为GC使用了标记和扫描算法,这意味着只要没有其他引用ClassA和FormA的内容,它们就会被视为垃圾并被销毁(假设我没有遗漏与事件和表单相关的细微内容)。