在运行时向表单添加控件时,您可以执行以下任一操作:
Button btn = new Button();
//...
this.Controls.Add(btn);
或
Button x = new Button();
//...
btn.Parent = this;
我原以为他们是一样的,而这只是个人偏好的方式,但有人在工作时提到第二种方法更糟糕,因为当表格处理时按钮不会被处理掉(假设没有添加任何事件处理程序并且正在保留它们。
这对我来说没有多大意义所以我在网上看了一下,但找不到任何说法。
有人知道答案还是能指出正确的方向?
答案 0 :(得分:12)
由于推测是浪费时间,我抓住了Reflector的副本并查看了实际的代码。 Parent属性调用ParentInternal属性,该属性又调用 value.Controls.Add(this)
/* 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);
}
}
}
}
基于此代码,方法是等效的,这完全是一个偏好的问题。
答案 1 :(得分:3)
我总是首选确定哪个对象的控件我要将新控件添加到...
Button btn = new Button();
this.PlaceHolder1.Controls.Add(btn);
Button btn2 = new Button();
this.PlaceHolder2.Controls.Add(btn2);
我觉得这更容易阅读,你不必做任何家谱分析来弄清楚父母是谁......
我相信在内部使用.Parent代码会执行.Controls.Add,因此它们应该具有相同的最终结果,但对我而言,它归结为代码可读性。
StackOverflow上有类似的问题。
答案 2 :(得分:3)
如果您正在编写一个在其持续时间内打开和关闭大量表单的应用程序,我可以看到按钮处理可能成为问题的位置。您需要确保手头有一些正确的处理代码,以确保应用程序不会占用太多内存。
除此之外,我喜欢第一个声明,因为它更清楚地解释了你的代码在做什么。您正在创建一个新按钮,并将其添加到页面上的现有控件。您可以在调试/重构时阅读此内容并了解正在发生的事情。在第二组代码中,这稍微模糊一些。如果你刷过初始按钮声明并看到btn.Parent =这个声明,你可能会被认为是你将按钮重新分配给一个新表格,或者是那种效果。
听起来确实有些挑剔,但最近我一直在帮助一些同事向他们展示我的一些代码,我发现虽然肯定有不止一种方法给猫皮,但有时候有一种剥皮方式可以在将来看待事物时更好地解释自己。
答案 3 :(得分:1)
在第二种情况下,控件可能在表单没有处理时(我不确定它是否确实),但它应该被下一轮垃圾收集释放,因为它不应该在处理表格后对其进行任何硬性引用。结果是,对于大多数应用程序来说,按钮是否与表单一起处理是没有问题的。在绝大多数使用表单的应用程序中,用户是瓶颈,因此在处理表单控件集合之前,是否必须等待垃圾收集器的一次或两次传递不应影响您的设计决策。
有人说过,我更喜欢
this.Controls.Add(btn);
因为它似乎在语义上更适合你实际做的事情。我总是使用此方法而不是设置 Control.Parent 属性。
答案 4 :(得分:0)
这真的是品味问题。以下是在Parent
上设置Control
属性时发生的情况。此代码由.NET Reflector提供。
set
{
if (this.parent != value)
{
if (value != null)
{
value.Controls.Add(this);
}
else
{
this.parent.Controls.Remove(this);
}
}
}
答案 5 :(得分:-1)
我认为两者都会产生相同的结果
答案 6 :(得分:-1)
我个人喜欢
Button btn = new Button();
//...
this.Controls.Add(btn);
因为,它是更明确和可读的代码。