C# 在处理控件后是否需要删除它们?
.NET 2C# 在处理控件后是否需要删除它们?,c#,.net,.net-2.0,controls,dispose,C#,.net,.net 2.0,Controls,Dispose,.NET 2 // dynamic textbox adding myTextBox = new TextBox(); this.Controls.Add(myTextBox); // ... some code, finally // dynamic textbox removing myTextBox.Dispose(); // this.Controls.Remove(myTextBox); ?? is this needed 很少解释 当然,如果我处置了一个控件,我将不再看到它
// dynamic textbox adding
myTextBox = new TextBox();
this.Controls.Add(myTextBox);
// ... some code, finally
// dynamic textbox removing
myTextBox.Dispose();
// this.Controls.Remove(myTextBox); ?? is this needed
很少解释
- 当然,如果我处置了一个控件,我将不再看到它,但无论如何,它将在父控件集合中保持为“无”
- 是否需要像MSDN建议的那样,从控件中删除所有处理程序李>
- 不,你没有。
我试过了 您可以将以下代码粘贴到: 编辑:控件将从窗体的
集合中删除。要演示这一点,请将单击处理程序替换为以下内容:控件
它将显示b.Click += delegate { b.Dispose(); MessageBox.Show(form.Controls.Count.ToString());};
第二次编辑:0
包含以下代码:控制.处置(bool disposing)
编辑: MSDN建议您从控件中删除对象,然后在运行时从集合中删除对象时调用dispose:if (parent != null) { parent.Controls.Remove(this); }
请记住,如果您有一些代码在控件上进行迭代并执行某些操作,那么如果其中一个控件已被释放,则会出现异常。因此,一般来说,我可能会建议删除控件作为良好做法。经过一些测试后,我发现已处置的控件会自动从父控件集合中删除
更新 从控件的Dispose(bool)方法:Controls.add(myButton); //Control.Count==4 myButton.Dispose(); //Control.Count==3
关于Compact Framework 2+VS2005的进一步信息 如果从s.w.f.control派生的控件未实现以下功能,则设计器在删除该控件时可能会崩溃:Dispose() { if(this.parent!=null){ this.parent.controls.remove(this); } .... }
但是从Mat的答案来看,这种行为似乎取决于所使用的框架。我认为,他是在建议在使用紧凑框架时,必须删除一些控件,并将其处理掉 所以微软建议我们总是先删除,然后再进行处理,这是有意义的,尤其是当你将代码模块转移到其他框架时
为什么不试试看会发生什么?会发生什么?如果我处置一个控件,我将不再看到它,但无论如何,它将在父控件集合中保持“无”状态?只是出于好奇,为什么不删除它,然后处置它呢?我建议你把代码读得和你的意图一样会有很大帮助。我支持hometoast。听起来你是一个C++程序员,移动到C语言。如果您是,您可能想了解CLR是如何工作的——托管内存管理与旧的手动方式有点不同。你所做的就像是在自动变速器中寻找离合器。“这是不必要的。”hometoast:这个问题在现实中要复杂一点。我将控件添加到我不一定有权访问的容器中。我可以在方法中处置控件,但为了首先从父集合中移除它,我需要访问父集合。当然,如果
但是为什么要重复控件的Dispose方法中的相同代码?!。。。这是完全错误的。您应该始终手动调用(myControl.Parent)!=null
,以确保本机资源(在本例中为窗口句柄)在不再需要时立即释放。依靠终结器调用Dispose
将导致本机资源在GC运行时释放得更晚。@kbrinley:有时,MSDN告诉general认为这不一定是优化的等等……我发现了一篇MSDN文章,介绍了这种情况,这确实建议调用Remove-then-Dispose。@SLaks:我以为资源一直保存在内存中,直到内存满了,然后管理器执行清理。如果是这样的话,除了过早调用GC功能,调用dispose还有什么好处?@diadem-你说得对,在调用GC之前,资源将一直保存在内存中,但在正常情况下它不会调用dispose。这是理解差异的绝佳视角。基本上GC会在决定清理时调用每个未引用对象的终结器函数。不,你不会<代码>处置将从Dispose
集合中删除控件。我检查了。@hippo:显然,已处理的控件会自动从父控件集合中删除。+1做得好。有趣的是,msdn articale kbrinley发布的文章中提到了调用Remove-then-Dispose。看起来你只需要处理一下。很高兴知道,耶。现在,请相信MSDN,它建议首先删除,然后再处理控件…首先调用控件
将使代码更容易理解。然而,这对实际行为没有任何影响。remove
Controls.add(myButton); //Control.Count==4 myButton.Dispose(); //Control.Count==3
if (this.parent != null) { this.parent.Controls.Remove(this); }
Dispose() { if(this.parent!=null){ this.parent.controls.remove(this); } .... }