Idisposable Implementation - O que deve entrar 'if (disposing)'

Corrigi alguns problemas de vazamento de memória em um aplicativo winforms e notei alguns objetos descartáveis que não são Disposed explicitamente (o desenvolvedor não chamou o método Dispose). A implementação do método Finalize também não ajuda porque não entra emif (disposing) cláusula. Todo o cancelamento de registro estático de eventos e limpeza de coleção foram colocados emif (disposing) cláusula. A melhor prática é chamar Dispose se o objeto for descartável, mas infelizmente isso acontece às vezes

Se houver objetos não gerenciados, manipuladores de eventos estáticos e algumas coleções gerenciadas, é necessário limpar ao descartar. Qual é a maneira de decidir o que deve entrar e o que deve sairif (disposing) cláusula.

Dispose method.

// Dispose(bool disposing) executes in two distinct scenarios.
// If disposing equals true, the method has been called directly
// or indirectly by a user's code. Managed and unmanaged resources
// can be disposed.
// If disposing equals false, the method has been called by the
// runtime from inside the finalizer and you should not reference
// other objects. Only unmanaged resources can be disposed.
protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            // Free other state (managed objects).
        }

         // Free your own state (unmanaged objects).
         // Set large fields to null.
         disposed = true;
     }
 }

Di objetos gerenciados devem estar emif (disposing) que é executado normalmente somente quando chama explicitamente o método Dispose pelo desenvolvedor. Se o método Finalize foi implementado e o desenvolvedor esquece de chamar o método Dispose, a execução que vem aqui através do Finalizer não entra emif (disposing) seção

Abaixo estão as minhas perguntas.

Se eu tiver manipuladores de eventos estáticos que causem vazamentos de memória, onde devo desmarcá-los? Dentro ou fora deif (disposing) cláusula?

Se eu tiver algumas coleções que causem vazamentos de memória, onde devo limpá-las? Dentro ou fora deif (disposing) cláusula?

Se estiver usando objetos descartáveis de terceiros (por exemplo: controles devExpress winform), não tenho certeza se são objetos gerenciados ou não gerenciados. Digamos que eu queira descartá-los ao descartar um formulário. Como posso saber o que são gerenciados e o que são objetos não gerenciados? Ser descartável não diz isso? Nesses casos, como decidir o que deve entrar e o que deve sairif (disposing) cláusula?

Se não tenho certeza de que algo tenha sido gerenciado ou não gerenciado, quais podem ser as conseqüências ruins de eliminar / limpar / cancelar o registro de eventos doif (disposing) cláusula? Digamos que ele verifique nulo antes de descartar?

Edita

O que quero dizer como cancelar o registro de eventos é algo como abaixo. O Publisher é uma instância de vida longa e a linha abaixo está no construtor do assinante. Nesse caso, o assinante precisa cancelar o registro do evento e descartar antes do editor.

publisher.DoSomeEvent += subscriber.DoSomething;

questionAnswers(6)

yourAnswerToTheQuestion