List.Add(this)在一个类中

时间:2010-03-10 14:20:33

标签: c# console-application

我创建了一个课程。我在类中使用了List.Add(this),因此我可以访问稍后创建的控件。它似乎非常有用,我不知道如何创建控件(在没有预定义限制的同一父控件中多个控件)并稍后访问它们。

我在互联网上寻找Add(this),但无法找到更多信息。

这是一个大资源还是无效?为什么我无法找到更多相关信息?这似乎非常有用。

public class GlobalData
{

    private static List<Member> _Members;

public partial class ChildrenPanel
{

    private static List<ChildrenPanel> _ListCP = new List<ChildrenPanel>();

    //X and Y position Panel | Container is the control recieving the Control
    public void CreatePanel(int X, int Y, Panel Container)
    {
        // 
        // pnlStudent
        // 
        _pnlStudent.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
        _pnlStudent.Controls.Add(_lblCLastName);
        _pnlStudent.Controls.Add(_lblCFirstName);
        _pnlStudent.Controls.Add(_lblGrade);
        _pnlStudent.Controls.Add(_lblSelected);
        _pnlStudent.Controls.Add(_lblSeason);
        _pnlStudent.Controls.Add(_lblAvailable);
        _pnlStudent.Controls.Add(_lblGender);
        _pnlStudent.Controls.Add(_ddlGrade);
        _pnlStudent.Controls.Add(_ddlSelectedSports);
        _pnlStudent.Controls.Add(_ddlAvailableSports);
        _pnlStudent.Controls.Add(_ddlSeason);
        _pnlStudent.Controls.Add(_rdbFemale);
        _pnlStudent.Controls.Add(_rdbMale);
        _pnlStudent.Controls.Add(_btnRemoveChild);
        _pnlStudent.Controls.Add(_btnRemoveSport);
        _pnlStudent.Controls.Add(_btnAddSport);
        _pnlStudent.Controls.Add(_txtCLastName);
        _pnlStudent.Controls.Add(_txtCFirstName);
        _pnlStudent.Location = new System.Drawing.Point(X, Y);
        _pnlStudent.Name = "pnlStudent";
        _pnlStudent.Size = new System.Drawing.Size(494, 105);
        //Still playing with the tab index
        _pnlStudent.TabIndex = 10;

        // Adds controls to selected forms panel
        Container.Controls.Add(_pnlStudent);
        // Creates a list of created panels inside the class
        ListCP.Add(this);

}  

3 个答案:

答案 0 :(得分:1)

请确保在不再需要时再次删除实例,否则持有对它的引用的List将永久保留在内存中(毕竟,欢迎使用.NET中的内存泄漏)。

答案 1 :(得分:1)

如果您的列表是静态的或全局可用,那么您正在做一些非常糟糕的事情。

ASP.Net的结构使得每个用户对页面的每个请求(包括回发)都会产生页面类的新实例。这是很多页面实例。如果在某处保存对所有这些实例的引用,则实例永远不会被垃圾回收。您已经创建了类似于内存泄漏的东西,并且在部署到生产后很快就会发现自己耗尽了资源。

这里真正危险的是,如果你只进行功能测试并且没有负载测试,那么问题很可能在测试期间根本不会显示出来,因为在吹出之前它会在几百(甚至几千)个请求中正常工作在你身上。

如果您担心动态控件,有几种更好的方法可以解决这个问题:

  1. 对允许的最大控件数量设置一个固定限制,并将所有控件添加到页面中。然后根据需要显示/渲染它们(通过.Visible属性切换)。
  2. 让它以数据为导向。而不是动态添加控件,将某些内容插入数据库表,然后将该表上的查询绑定到转发器或其他数据控件(我的首选方法)。
  3. 确保您在页面生命周期中的正确位置(Pre-Init)重新创建所需的每个动态控件。

答案 2 :(得分:1)

一旦我看到一些代码,我可能会修改这个答案,但我最初的回答是它不是资源匮乏。至于它是否有效,将需要一些示例代码。

将对象添加到集合不会占用大量资源,因为您只是将对象的引用添加到集合中。您仍然只有一个对象,但有两个(或更多)指向该对象的变量,因此您使用的唯一额外资源是引用使用的最小内存。