Это означает, что указанная переменная не указана ни на что. Я мог бы сгенерировать это так:
SqlConnection connection = null;
connection.Open();
Это вызовет ошибку, потому что, пока я объявил переменную «connection
», она не указала ни на что. Когда я пытаюсь вызвать член «Open
», для его устранения нет ссылки, и он будет вызывать ошибку.
Чтобы избежать этой ошибки:
object == null
. Инструмент Resharper JetBrains определит каждое место в вашем коде, которое имеет возможность ошибки нулевой ссылки, позволяя вам ввести нулевую проверку. Эта ошибка является источником ошибок номер один, IMHO.
Вы должны следить за кодом, подобным этому, удаление элементов управления из своего контейнера, как это приводит к утечке ресурса. Controls.Remove / At () или метод Controls.Clear (), предложенный другими плакатами, удаляет элемент управления из коллекции и повторно размещает его в «окне парковки». В противном случае невидимое окно, в котором собственное окно может найти гостеприимный дом без необходимости его уничтожения. Готов к повторному размещению у другого родителя.
Который является ловушкой, вы, как правило, не переносите его на другого родителя. Элемент управления будет продолжать выживать в окне парковки, потребляя собственные ресурсы Windows. Сборщик мусора не может восстановить эти ресурсы. В конце концов ваша программа выйдет из строя, когда Windows откажется предоставить больше окон вашему процессу. Сообщение об исключении скажет «Ошибка создания дескриптора».
Вместо этого вы должны распоряжаться элементом управления. Который также автоматически удаляет элемент управления из его родителя. Правильный код:
while (contentsPanel.Controls.Count > 0) contentsPanel.Controls[0].Dispose();
Или итерация назад, если вы обнаружите, что это слишком странно выглядит.
Каждый раз, когда вы удаляете элемент управления из коллекции, коллекция изменяется. Когда вы удаляете 1-й элемент из Controls
, второй элемент становится первым, поэтому, когда вы начинаете удаление второго элемента управления, вы фактически удаляете третий элемент из оригинальной коллекции (пропускающий второй элемент).
Если вы хотите для удаления всех элементов управления, содержащихся в коллекции, используйте this.contentsPanel.Controls.Clear()
. Если вы хотите удалить элементы управления по своим индексам в ControlCollection
, сначала выберите элементы управления для удаления в отдельный список или массив, а затем удалите их.
Ошибка 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) проще.
Если вы хотите удалить их все, просто выполните
this.contentsPanel.Controls.Clear()