List.Add (this) внутри класса - PullRequest
0 голосов
/ 10 марта 2010

Я создал класс некоторое время назад. Я использовал List.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 ]

1 голос
/ 10 марта 2010

Если ваш список статичен или доступен по всему миру, значит, вы делаете что-то очень плохое.

ASP.Net структурирован таким образом, что каждый запрос к вашей странице - включая постбэки - от каждого пользователя приводит к новому экземпляру класса страницы. это много экземпляров страницы. Если ссылки на все эти экземпляры сохраняются где-то, эти экземпляры никогда не могут быть собраны мусором. Вы создали нечто похожее на утечку памяти, и вы быстро обнаружите, что ресурсы исчерпаны после развертывания в производство.

Действительно опасная вещь здесь в том, что если вы только выполняете функциональное тестирование и не тестируете нагрузку, проблема, скорее всего, вообще не обнаружится во время ваших тестов, потому что она будет хорошо работать для нескольких сотен (может быть, даже тысяч) запросов перед отправкой на вас.

Если вы беспокоитесь о динамическом управлении, есть несколько лучших способов справиться с этим:

  1. Установите фиксированное ограничение на максимальное количество элементов управления, которое вы разрешите, и добавьте все из них на страницу впереди. Затем только показывайте / отображайте их (переключаются через свойство .Visible) так, как вам нужно.
  2. Сделать это управляемым данными. Вместо того, чтобы динамически добавлять элемент управления, вставьте что-либо в таблицу базы данных, а затем привяжите запрос к этой таблице к повторителю или другому элементу управления данными (мой предпочтительный метод).
  3. Просто убедитесь, что вы воссоздаете каждый необходимый вам динамический элемент управления в нужном месте (Pre-Init) в жизненном цикле страницы.
1 голос
/ 10 марта 2010

Я могу пересмотреть этот ответ, как только увижу некоторый код, но мой первоначальный ответ заключается в том, что это не боров ресурсов. Относительно того, эффективен он или нет, потребуется пример кода.

Добавление объекта в коллекцию не требует большого количества ресурсов, поскольку вы просто добавляете ссылку на объект в коллекцию. У вас все еще есть только один объект, но две (или более) переменные, которые указывают на этот объект, поэтому единственными дополнительными ресурсами, которые вы используете, является минимальный объем памяти, используемый ссылками.

1 голос
/ 10 марта 2010

Просто убедитесь, что вы удалили экземпляр еще раз, когда он больше не нужен, иначе список, содержащий ссылку на него, сохранит его в памяти навсегда (в конце концов, добро пожаловать в утечки памяти в .NET).

...