代码之家  ›  专栏  ›  技术社区  ›  Pondidum

运行时添加控件的最佳实践

  •  8
  • Pondidum  · 技术社区  · 16 年前

    在运行时向窗体添加控件时,可以执行以下任一操作:

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

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

    我曾假设它们是相同的,这取决于个人偏好的方式,但是工作人员提到第二种方法更糟糕,因为当表单被释放时,按钮不会被释放(假设没有添加事件处理程序并且被保留)。

    这对我来说没什么意义,所以我在网上看了一眼,但找不到任何东西可以这样或那样说。

    有人知道答案吗,还是能给我指明正确的方向?

    7 回复  |  直到 16 年前
        1
  •  12
  •   Jack Bolding    16 年前

    既然投机是浪费时间,我就拿了一份 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);
                    }
                }
            }
        }
    

    基于此代码,这些方法是等效的,这是一个严格的偏好问题。

        2
  •  3
  •   Dillie-O    16 年前

    如果您正在编写一个应用程序,它在运行期间打开和关闭许多表单,那么我可以看到按钮处理在哪里可能是一个问题。您需要确保手头有一些适当的处理代码,以确保应用程序不会占用太多内存。

    除此之外,我喜欢第一个语句,因为它更清楚地解释了代码在做什么。您正在创建一个新按钮,并将其添加到页面上现有的控件中。在调试/重构时,您可以直接阅读以上内容,并了解正在发生的事情。在第二组代码中,这一点稍显模糊。如果刷过初始按钮声明并看到btn.parent=此语句,则可能会导致您认为正在将按钮重新分配给新表单,或者为此目的进行了某些操作。

    这听起来确实有点挑剔,但最近我通过向一些同事展示我的一些代码来帮助他们,我开始发现,虽然给一只猫剥皮的方法肯定不止一种,但有时也有某种剥皮的方法,这在将来看东西时能更好地解释自己。

        3
  •  3
  •   Community CDub    8 年前

    我一直倾向于确定要将新控件添加到哪个对象的控件…

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

    我觉得这更容易阅读,你不必做任何家庭树分析来找出谁是父母…

    我相信在内部使用.parent代码可以实现.controls.add,因此它们应该有相同的最终结果,但对我来说,归根结底是代码可读性。

    这里有一个类似的问题 StackOverflow .

        4
  •  1
  •   Dathan    16 年前

    在第二种情况下,当窗体释放时,控件可能不会被释放(我不确定它是否释放),但无论如何,它应该在下一轮垃圾收集中释放,因为处理完窗体后不应该有任何硬引用。其结果是,对于大多数应用程序来说,按钮是否随表单一起被释放是一个没有问题的问题。在绝大多数使用表单的应用程序中,用户是瓶颈,因此,在处理表单控件集合之前,是否必须等待一个或两个垃圾收集器传递,不应影响您的设计决策。

    我宁愿这样说

    this.Controls.Add(btn);
    

    因为它在语义上更适合你实际所做的。我总是使用这种方法,而不是设置 家长控制 财产。

        5
  •  0
  •   PeterAllenWebb    16 年前

    这是一个真正的品味问题。下面是当你设置 Parent A上的属性 Control . 此代码由.NET Reflector提供。

    set
    {
        if (this.parent != value)
        {
            if (value != null)
            {
                value.Controls.Add(this);
            }
            else
            {
                this.parent.Controls.Remove(this);
            }
        }
    }
    
        6
  •  -1
  •   Bertvan    16 年前

    我认为两者的结果是一样的

        7
  •  -1
  •   Syed Tayyab Ali    16 年前

    我个人喜欢

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

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

    推荐文章