【问题标题】:TextBox + event with anonymous method, and Dispose带有匿名方法的 TextBox + 事件和 Dispose
【发布时间】:2013-10-31 15:58:31
【问题描述】:

示例代码:

textBox.Click += (s, e) => { ... };
textBox.Dispose ();
textBox = null;

文本框会被GC收集吗?

【问题讨论】:

  • 如果没有 Dispose 或将其设置为 null 也不会......
  • @minitech。是否必须先从文本框中删除事件? textBox.Click -= (s, e) => { ... }
  • @Harrison 不,它没有
  • @Harrison:不,它不会那样工作(你需要保留对代表的引用)
  • 这完全取决于 lambda 表达式中的代码。它将倾向于捕获 this(Form 对象),可能是 TextBox 对象。如果它将这些引用交给其他代码,那么您很可能会遇到问题。这并不常见。

标签: c# winforms events garbage-collection


【解决方案1】:

是的,它将被收集。仅当对事件的 source 的引用未被删除时,删除事件处理程序才重要。文本框是源,您将引用归零,所以没关系。

如果你这样做,你会遇到问题:

parent.Add(textBox);
parent.Click += textBox.HandleParentClick;
parent.Remove(textBox);

父级仍然在此范围内,因此事件对文本框的引用(通过其处理程序)也仍然存在,即使通过添加/删除对文本框的直接引用已被删除。

【讨论】:

    【解决方案2】:

    最终,是的。当 GC 决定这样做时。

    【讨论】:

    • 根据my comment,确实没有足够的信息来提供这样的答案。
    • 对,Servy。确实没有足够的信息来知道垃圾收集器最终会收集无效的对象......除非它的行为符合设计。
    • 1) 我们不知道在那个时间点,textbox 过去引用的对象是否在其他地方引用了它。 2)我们甚至(技术上)不知道它的类型;它可能是我们所知道的值类型。 3) 进程可以在 GC 收集到一个对象之前被拆除,你永远不能说某件事 被 GC,只有当一个对象 有资格集合textbox设置为null时可能是合格的,它添加到的表单关闭时可能是合格的,应用程序终止时可能是合格的,我们不知道。
    • @Servy 答案不正确。对于您的观点:1)和 3)这意味着除非给出完整的代码,否则任何答案都会“误导”,并且出于同样的原因,给定的答案对于任何其他项目中的提问者(或任何访问者)都是无用的,因为代码会有所不同。为了使本网站具有任何价值,我们必须做出合理的假设并给出一般性的答案。 2)知道would not help the answer be more accurate的类型。
    • @Servy 您似乎是这里唯一一个无法凭直觉知道这不是一个需要详尽广泛答案的广泛问题的人。我们了解提问者所苦苦挣扎的基本概念,并能够提供解决该问题的一般性答案。这肯定比您发布诸如“GC 对值类型不做任何事情”之类的彻头彻尾的谎言更有帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2014-10-19
    • 2012-04-02
    • 2018-10-06
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多