2015-03-16 3 views
4

Чем больше я копаюсь в C# и GC, я нахожу все больше и больше вещей, о которых я не совсем уверен. Я всегда думал, что Dispose и соответствующий Finalizer необходимы только при наличии неуправляемых ресурсов в моих классах.Должен ли я удалить обработчик

Но у меня есть много случаев, когда есть только родные классы C#, где мне не совсем понятно, нужен ли мне Dispose и соответствующий Finalizer. Например, когда у меня есть обработчики событий, связанные с моими событиями.

Нужно ли удалять обработчики событий при вызове Dispose. Также мне сказали, что объект может не получить, если обработчики событий все еще подключены. Если это так, то GC каким-то образом скомпрометирован.

Можно ли суммировать, когда и как мне нужно реализовать Dispose и Finalizer?

На самом деле у меня есть больше вопросов об этом, но, возможно, ответ на этот вопрос может помочь мне дальше.

+1

Связанный пост: [Плохо не отменять регистрацию обработчиков событий?] (Http://stackoverflow.com/questions/1061727/is-it-bad-to-not-unregister-event-handlers) – SwDevMan81

+2

Это может быть полезно: http://stackoverflow.com/questions/27994984/does-not-removing-event-handlers-cause-problems-in-net/27995156#27995156.Краткая версия: не забудьте отключить обработчики событий, подключенные к событиям на долгоживущих объектах; не беспокойтесь о отключении обработчиков событий на короткоживущих объектах. – adv12

+1

Также от Jon Skeet: [Должен ли я всегда отключать обработчики событий в методе Dispose?] (Http://stackoverflow.com/questions/17399991/should-i-always-disconnect-event-handlers-in-the- dispose-method) – bokibeg

ответ

2

Чтобы очистить вверх ваш общий вопрос о том, когда делать Dispose и Finalize:

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

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

Для обработчиков событий это вопрос личных предпочтений. Вы можете, но это имеет значение только если вы делаете или нет if the person who subscribed to the event messed up their code.

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

Я лично нет, но я знаю некоторых людей, которые делают , Если вы хотите это сделать, процесс просто устанавливает обработчик события null в вашем методе размещения.

public sealed class Example : IDisposable 
{ 
    public EventHandler MyEvent; 

    public void Dispose() 
    { 
     MyEvent = null; 
    } 
} 

EDIT: А хороший момент, что Hans Passant brought up in the comments: Вы никогда не необходимости финализатор, если у вас есть неуправляемый ресурс, который нужно будет финализации он должен получить завернутые в SafeHandle обертке, чтобы справиться с финализация для вас. Как только вы сделаете это, объект просто станет другим нормальным IDisposable, о котором вам нужно позаботиться в своем методе .Dispose().

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

  • Нет связанных вопросов^_^