Когда я должен утилизировать элементы управления вручную? Как узнать, реализует ли элемент управления IDisposable? - PullRequest
1 голос
/ 05 марта 2009

В предыдущем вопросе об удалении из панели задач старого NotifyIcon мне сказали, что я должен избавиться от всего, что реализует IDisposable. Звучит как хорошая практика для меня, однако, как новичок, это вызывает больше вопросов :-)

Как узнать, реализует ли элемент управления IDisposable?

Должен ли я создать класс, который пытается разместить все на всех моих формах в событии formclosed?

Как-то так? (Psuedocode):

foreach(control cont in form)  
{  
try{cont.Dispose()}  
catch{}  
}

Если нет, то как узнать, какие элементы управления мне нужно было бы использовать вручную, или я должен просто следить за необычным поведением во время тестирования?

G

РЕДАКТИРОВАТЬ: Итак, когда я нажимаю большую красную "X" на моей дочерней форме, это не заставляет его распоряжаться? это правильно? Что является причиной этого?

Ответы [ 4 ]

2 голосов
/ 05 марта 2009

Один из вариантов - запустить FxCop над вашими сборками. Одно из его правил будет проверять, что Dispose вызывается для всех объектов, которые реализуют IDisposable, и предупредит вас, если у вас есть нарушения.

РЕДАКТИРОВАТЬ: Чтобы ответить на ваш следующий вопрос, Dispose не вызывается автоматически. Вы должны справиться с этим самостоятельно. Вот одна статья на эту тему.

2 голосов
/ 05 марта 2009

Любой элемент управления, которым владеет форма, удаляется при ее удалении. Другими словами, при вызове Dispose () элемент управления будет вызывать Dispose () для всех своих дочерних элементов. Обратите внимание, что скрытие формы не вызовет Dispose (), но в большинстве случаев хорошо просто создать диалог и утилизировать его по мере необходимости.

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

Любой класс, реализующий IDisposable, должен вызывать Dispose () для своих потомков, независимо от того, находится ли он в коллекции или в свойстве, если только для этого нет веской причины (т. Е. В некоторых случаях вызывающая сторона может оставаться владельцем объекта - но это как раз то, для чего нужна концепция установления владельца).

0 голосов
/ 30 декабря 2009

Если вы нажмете X, чтобы закрыть модальную форму, форма фактически будет скрыта. Вы должны вручную вызвать dispose для освобождения ресурса.
Смотрите здесь: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult.aspx

0 голосов
/ 05 марта 2009

Вы можете проверить с помощью оператора is, что объект реализует IDisposable:

if(object is IDisposable) {
    ((IDisposable)object).Dispose();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...