2009-06-09 293 views
8

当添加控件在运行时的形式,你可以做以下任一操作:最佳实践

Button btn = new Button(); 
//... 
this.Controls.Add(btn); 

Button x = new Button(); 
//... 
btn.Parent = this; 

我曾以为他们是同样的,这只是个人喜好以哪种方式去做,但有人在工作中提到第二种方法更糟糕,因为按钮在表单处理时不会被处理掉(假设没有添加事件处理程序并且是被保持)。

这对我来说没有什么意义,所以我看了一下在线,但找不到任何可以说某种方式的东西。

有人知道答案或可以指向正确的方向吗?

+0

您可能是指this.Controls.Add ... – 2009-06-09 15:17:11

+0

您的权利,修正。 – Pondidum 2009-06-09 15:17:45

+0

Duplicate:http://stackoverflow.com/questions/961554/difference-between-setting-control-parent-property-and-using-controls-add – RSolberg 2009-06-09 16:02:02

回答

12

由于猜测是浪费时间,我抓住了我的副本Reflector,并看看实际的代码。 Parent属性调用ParentInternal属性,进而调用value.Controls.Add(本)

/* this code is part of the .NET Framework was decompiled by Reflector and is copyright Microsoft */ 
    internal virtual Control ParentInternal 
    { 
     get 
     { 
      return this.parent; 
     } 
     set 
     { 
      if (this.parent != value) 
      { 
       if (value != null) 
       { 
        value.Controls.Add(this); 
       } 
       else 
       { 
        this.parent.Controls.Remove(this); 
       } 
      } 
     } 
    } 

在此基础上的代码,该方法是等价的,严格来说这是偏好的问题。

+0

哦。你击败了我!没有人应该没有反射器。 – PeterAllenWebb 2009-06-09 15:47:40

+3

为了支持的目的,.Parent比.ControlsAdd()更难读取和解释。 – RSolberg 2009-06-09 16:00:51

+0

@RSolberg - 我不反对Controls.Add更明确,但这不是提出的问题。问题是使用.Parent模式会出现Dispose问题。根据实际的代码,不会有任何代码。 – 2009-06-10 02:54:31

-1

我认为无论结果是一回事

3

我一直喜欢鉴定对象的控制我要添加新的控制......

Button btn = new Button(); 
this.PlaceHolder1.Controls.Add(btn); 

Button btn2 = new Button(); 
this.PlaceHolder2.Controls.Add(btn2); 

我觉得这是更容易阅读,你不必做任何家谱分析,找出谁的父母是...

我相信使用.Parent代码内部做的.Controls.Add,所以他们应该有同样的最终结果,但对我来说,它归结为代码可读性。

StackOverflow上也有类似的问题。

-1

我个人很喜欢

Button btn = new Button(); 
//... 
this.Controls.Add(btn); 

因为,它是更加明确和可读的代码。

3

如果您正在编写一个在其持续时间内打开和关闭大量表单的应用程序,我可以看到按钮处理可能会成为问题。您需要确保您有一些正确的处理代码,以确保应用程序不会吸收太多内存。

除此之外,我喜欢第一个陈述,因为它更清楚地解释了你的代码在做什么。您正在创建一个新按钮,并将其添加到页面上的现有控件。您可以在调试/重构时阅读正确的内容,并理解正在发生的事情。在第二组代码中,这稍微含糊不清。如果你刷过了最初的按钮声明并看到了btn.Parent =这个声明,那么你可能会被认为你正在将按钮重新分配给一个新窗体,或者是这个窗体。

这听起来有些挑剔,但最近我一直在帮助一些同事,向他们展示我的一些代码,并且我会发现,虽然绝对有一种方法可以给皮肤上一只猫,有时候会有一些剥皮的方法,在将来看事情时会更好地解释自己。

1

在第二种情况下,控件可能在表单没有被处置时(我不确定它是否存在),但它应该在下一轮垃圾回收时释放,因为不应该存在“在处理表格之后,不要过分强调它。结果是,对于大多数应用程序来说,按钮是否与表单一起处理并不是问题。在绝大多数使用表单的应用程序中,用户是瓶颈,因此在处理表单控件集合之前,是否必须等待垃圾收集器的一两次传递才能影响您的设计决策。

话虽如此,我更喜欢

this.Controls.Add(btn); 

,因为它似乎是你实际上在做什么语义上更合适。我总是使用这种方法,而不是设置Control.Parent属性。

0

这确实是一个味道问题。当您在Control上设置Parent属性时,会发生以下情况。这段代码来自.NET Reflector。

set 
{ 
    if (this.parent != value) 
    { 
     if (value != null) 
     { 
      value.Controls.Add(this); 
     } 
     else 
     { 
      this.parent.Controls.Remove(this); 
     } 
    } 
}