Элементы управления формой Vb.net замедляются при очистке [дубликат]

Это означает, что указанная переменная не указана ни на что. Я мог бы сгенерировать это так:

SqlConnection connection = null;
connection.Open();

Это вызовет ошибку, потому что, пока я объявил переменную «connection», она не указала ни на что. Когда я пытаюсь вызвать член «Open», для его устранения нет ссылки, и он будет вызывать ошибку.

Чтобы избежать этой ошибки:

  1. Всегда инициализируйте свои объекты, прежде чем пытаться что-либо с ними делать.
  2. Если вы не уверены, что объект имеет значение null, проверьте его с помощью object == null.

Инструмент Resharper JetBrains определит каждое место в вашем коде, которое имеет возможность ошибки нулевой ссылки, позволяя вам ввести нулевую проверку. Эта ошибка является источником ошибок номер один, IMHO.

2
задан Otiel 11 December 2011 в 20:35
поделиться

4 ответа

Вы должны следить за кодом, подобным этому, удаление элементов управления из своего контейнера, как это приводит к утечке ресурса. Controls.Remove / At () или метод Controls.Clear (), предложенный другими плакатами, удаляет элемент управления из коллекции и повторно размещает его в «окне парковки». В противном случае невидимое окно, в котором собственное окно может найти гостеприимный дом без необходимости его уничтожения. Готов к повторному размещению у другого родителя.

Который является ловушкой, вы, как правило, не переносите его на другого родителя. Элемент управления будет продолжать выживать в окне парковки, потребляя собственные ресурсы Windows. Сборщик мусора не может восстановить эти ресурсы. В конце концов ваша программа выйдет из строя, когда Windows откажется предоставить больше окон вашему процессу. Сообщение об исключении скажет «Ошибка создания дескриптора».

Вместо этого вы должны распоряжаться элементом управления. Который также автоматически удаляет элемент управления из его родителя. Правильный код:

 while (contentsPanel.Controls.Count > 0) contentsPanel.Controls[0].Dispose();

Или итерация назад, если вы обнаружите, что это слишком странно выглядит.

13
ответ дан Hans Passant 1 September 2018 в 09:58
поделиться

Каждый раз, когда вы удаляете элемент управления из коллекции, коллекция изменяется. Когда вы удаляете 1-й элемент из Controls, второй элемент становится первым, поэтому, когда вы начинаете удаление второго элемента управления, вы фактически удаляете третий элемент из оригинальной коллекции (пропускающий второй элемент).

Если вы хотите для удаления всех элементов управления, содержащихся в коллекции, используйте this.contentsPanel.Controls.Clear(). Если вы хотите удалить элементы управления по своим индексам в ControlCollection, сначала выберите элементы управления для удаления в отдельный список или массив, а затем удалите их.

7
ответ дан MagnatLU 1 September 2018 в 09:58
поделиться

Ошибка foreach не будет выполнена, потому что вы меняете коллекцию, которая прерывает итератор.

Ошибка сбоя, потому что вы удаляете только каждый другой элемент; рассмотрим: i = 0, вы удалите нулевой элемент. Теперь элемент, который был элементом 1, является элементом 0 - поэтому, когда вы удаляете элемент 1 (итерация следующего цикла), вы подпрыгнули.

Короткая версия: используйте Clear():

contentsPanel.Controls.Clear();

Более длинная версия: итерация назад:

for(int i=contentsPanel.Controls.Count-1; i>=0;i--) {
   contentsPanel.Controls.RemoveAt(i);
}

Первый (Clear) проще.

3
ответ дан Rune FS 1 September 2018 в 09:58
поделиться

Если вы хотите удалить их все, просто выполните

this.contentsPanel.Controls.Clear()
4
ответ дан Sebastian Piu 1 September 2018 в 09:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: