C# 文本框+;具有匿名方法的事件,并进行处置

C# 文本框+;具有匿名方法的事件,并进行处置,c#,winforms,events,garbage-collection,C#,Winforms,Events,Garbage Collection,示例代码: textBox.Click += (s, e) => { ... }; textBox.Dispose (); textBox = null; 文本框将由GC收集吗?最终,是的。当GC决定这样做时。是,它将被收集。只有在未删除对事件源的引用时,删除事件处理程序才很重要。文本框是源代码,您正在将引用置零,这样就可以了 如果您这样做,您会遇到问题: parent.Add(textBox); parent.Click += textBox.HandleParentClick; pa

示例代码:

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

文本框将由GC收集吗?

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

是,它将被收集。只有在未删除对事件源的引用时,删除事件处理程序才很重要。文本框是源代码,您正在将引用置零,这样就可以了

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

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

父级仍在此处的作用域中,因此事件对文本框的引用(通过其处理程序)也会保留,即使通过添加/删除对文本框的直接引用已被删除。

也不会对其进行
Dispose
处理或将其设置为
null
。@minitech。是否必须先从文本框中删除事件
textBox.Click-=(s,e)=>{…}
@Harrison不,它没有t@Harrison:不,它不会那样工作(您需要保留对委托的引用),它完全取决于lambda表达式中的代码。它将倾向于捕获这个(表单对象),可能是TextBox对象。如果它将这些引用交给其他代码,那么您可能会遇到问题。这并不常见。确实没有足够的信息来提供这样的答案。对,Servy。实际上没有足够的信息知道垃圾收集器最终会收集无效对象。。。除非它的行为符合设计要求。1)我们不知道在那个时间点,用于引用的
textbox
对象是否在其他地方保留了对它的引用。2) 我们甚至(技术上)不知道它的类型;据我们所知,它可能是一种值类型。3) 这个过程可以在GC收集对象之前被拆掉,你不能说什么东西会被GCed,你只能说什么时候一个对象有资格被收集。当
textbox
设置为空时,它可能合格;当它添加到的表单关闭时,它可能合格;当应用程序终止时,它可能合格;我们不知道。@Servy答案不正确。你的观点是:1)和3)这意味着除非给出完整的代码,否则任何答案都是“误导性的”,同样的道理,给定的答案对任何其他项目的提问者(或任何访问者)都是无用的,因为代码是不同的。对于这个网站有任何价值,我们必须作出合理的假设,并给出一般性的答案。2) 知道类型。@Servy你似乎是这里唯一一个不能凭直觉认为这不是一个需要详尽广泛答案的广泛问题的人。我们理解提问者正在努力解决的基本概念,并且能够提供解决该问题的一般答案。当然,这比你发布诸如“GC对值类型不做任何事情”之类的彻头彻尾的谎言更有帮助。