C# 在处理控件后是否需要删除它们?

C# 在处理控件后是否需要删除它们?,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 很少解释 当然,如果我处置了一个控件,我将不再看到它

.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
很少解释
  • 当然,如果我处置了一个控件,我将不再看到它,但无论如何,它将在父控件集合中保持为“无”
  • 是否需要像MSDN建议的那样,从控件中删除所有处理程序
      不,你没有。
      我试过了

      您可以将以下代码粘贴到:

      编辑:控件将从窗体的
      控件
      集合中删除。要演示这一点,请将单击处理程序替换为以下内容:

      b.Click += delegate { b.Dispose(); MessageBox.Show(form.Controls.Count.ToString());};
      
      它将显示
      0

      第二次编辑
      控制.处置(bool disposing)
      包含以下代码:

                      if (parent != null) { 
                          parent.Controls.Remove(this); 
                      }
      
      编辑:

      MSDN建议您从控件中删除对象,然后在运行时从集合中删除对象时调用dispose:


      请记住,如果您有一些代码在控件上进行迭代并执行某些操作,那么如果其中一个控件已被释放,则会出现异常。因此,一般来说,我可能会建议删除控件作为良好做法。

      经过一些测试后,我发现已处置的控件会自动从父控件集合中删除

      Controls.add(myButton); //Control.Count==4
      myButton.Dispose(); //Control.Count==3
      
      更新

      从控件的Dispose(bool)方法:


      关于Compact Framework 2+VS2005的进一步信息 如果从s.w.f.control派生的控件未实现以下功能,则设计器在删除该控件时可能会崩溃:

      Dispose()  
      {  
       if(this.parent!=null){  
        this.parent.controls.remove(this);   
       }  
       ....  
      }  
      

      但是从Mat的答案来看,这种行为似乎取决于所使用的框架。我认为,他是在建议在使用紧凑框架时,必须删除一些控件,并将其处理掉

      所以微软建议我们总是先删除,然后再进行处理,这是有意义的,尤其是当你将代码模块转移到其他框架时


      为什么不试试看会发生什么?会发生什么?如果我处置一个控件,我将不再看到它,但无论如何,它将在父控件集合中保持“无”状态?只是出于好奇,为什么不删除它,然后处置它呢?我建议你把代码读得和你的意图一样会有很大帮助。我支持hometoast。听起来你是一个C++程序员,移动到C语言。如果您是,您可能想了解CLR是如何工作的——托管内存管理与旧的手动方式有点不同。你所做的就像是在自动变速器中寻找离合器。“这是不必要的。”hometoast:这个问题在现实中要复杂一点。我将控件添加到我不一定有权访问的容器中。我可以在方法中处置控件,但为了首先从父集合中移除它,我需要访问父集合。当然,如果
      (myControl.Parent)!=null
      但是为什么要重复控件的Dispose方法中的相同代码?!。。。这是完全错误的。您应该始终手动调用
      Dispose
      ,以确保本机资源(在本例中为窗口句柄)在不再需要时立即释放。依靠终结器调用
      Dispose
      将导致本机资源在GC运行时释放得更晚。@kbrinley:有时,MSDN告诉general认为这不一定是优化的等等……我发现了一篇MSDN文章,介绍了这种情况,这确实建议调用Remove-then-Dispose。@SLaks:我以为资源一直保存在内存中,直到内存满了,然后管理器执行清理。如果是这样的话,除了过早调用GC功能,调用dispose还有什么好处?@diadem-你说得对,在调用GC之前,资源将一直保存在内存中,但在正常情况下它不会调用dispose。这是理解差异的绝佳视角。基本上GC会在决定清理时调用每个未引用对象的终结器函数。不,你不会<代码>处置将从
      控件
      集合中删除控件。我检查了。@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);   
       }  
       ....  
      }