2010-03-10 6 views
0

Я создал класс некоторое время назад. Я использовал List.Add (this) внутри класса, чтобы я мог получить доступ к элементам управления, которые я создал позже. Это было очень полезно, и я не знаю, как создавать элементы управления (более одного в одном и том же родительском элементе без предопределенного ограничения) и обращаться к ним позже.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); 

} 
+2

Asp.net? WinForms? –

+0

'Добавить (это)' может означать очень много разных вещей. Можете ли вы разместить свой код? –

+0

Похоже, что это общий набор (список) элементов управления. Это то, о чем вы говорите? – WVDominick

ответ

1

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

1

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

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

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

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

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

Извините за консольное приложение. Я занимаюсь asp.net на работе и играю с консольными вещами дома. Я иногда смешиваю их. Получите некоторые интересные ошибки. – Hazior

+0

Хорошо. Для записи и любого другого, кто читает это позже, вопрос был отмечен asp.net в то время, когда я опубликовал. –

+0

Извините. – Hazior

1

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

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

+0

Это может вызвать большие проблемы, если ссылка в коллекции не позволяет объекту удаляться, когда он должен быть. –

+0

Правда, поэтому я оставил себя вне, как только узнал больше о конкретном коде в вопросе. –

Смежные вопросы