C # Должен ли я вручную удалить обработчик событий, который я объявил? - PullRequest
3 голосов
/ 03 августа 2011

Хорошо, приведите пример здесь:

  1. У меня есть UserControl A, UserControl B, UserControl C и одна форма Windows.
  2. Эта форма Windows запускается только с UserControl A.
  3. UserControl C имеет кнопки [Next] и [Back].
  4. Скажем, UserControl A объявлен с обработчиком событий.Одна из функций в UserControl A фактически вызовет вызов события для выполнения одной функции в UserControl C.
  5. Итак, в UserControl C я должен добавить с

"UserControlA.OneFunction + = this.UserControlC_Function;"

  1. Если я нажму кнопку Next на UserControl C, он будет располагать UserControl A и добавить новый UserControl B кФорма Windows.Но я никогда не удаляю этот обработчик событий вручную.

Одна из функций в UserControl A - это вызывающая сторона (где объявлено событие).
Одна из функций в UserControl C - это прослушиватель.

Итак, это мои вопросы:

  • Должен ли я вручную удалить обработчик до удаления UserControl A?
  • Будет ли этот пользовательский элемент управления A автоматически удалятьобработчик, который объявлен ранее?
  • Должен ли я добавить это куда-нибудь?

"UserControlA.OneFunction - = this.UserControlC_Function;"

Ответы [ 5 ]

3 голосов
/ 03 августа 2011
  1. По соглашению, мы не делаем. И поскольку ни одно событие не должно вызываться после удаления, нет необходимости делать это, если только рассматриваемый элемент управления не ведет себя странно.
  2. Нет. По крайней мере, нет такого кода, как видно из отражателя.
2 голосов
/ 03 августа 2011

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

Нужно ли удалять подписки на события из объектов передосиротели?

2 голосов
/ 03 августа 2011

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

0 голосов
/ 03 августа 2011

Если время жизни издателя событий не ограничено относительно срока полезного использования подписчика, отказ от подписки на событие, скорее всего, приведет к утечке памяти. Если бы не досадные хлопоты, связанные с этим, не было бы никаких оснований для подписчика событий, который был склонен не отписываться от всех событий, а для издателя событий, который был настроен не аннулировать все подписки на события. Поскольку ни C #, ни VB не предоставляют каких-либо удобных средств для выполнения этих задач, тем не менее, необходимо уравновешивать трудности надлежащей обработки подписки с тем фактом, что во многих ситуациях можно обойтись без экономии на этом.

0 голосов
/ 03 августа 2011

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

В вашей ситуации это не так (если я получу то, что вы описываете, код сделает это более понятным) Проблема будет в том, если вы присоедините делегат, ссылающийся на объект C, к событию на объекте A, а затем потеряете доступ к C (например, присвоите новое значение переменной). Затем С будет зависать, пока А не соберет мусор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...