IDisposable реализация - Что должно идти в «если (утилизации)»

Я исправил некоторые проблемы утечки памяти в приложении winforms и заметил некоторые одноразовые объекты, которые явно не удаляются (разработчик не вызвал метод Dispose). Реализация метода Finalize также не помогает, потому что он не входит вif (disposing) пункт. Все статические события отмены регистрации и очистки коллекции были помещены вif (disposing) пункт. Лучше всего вызывать Dispose, если объект одноразовый, но, к сожалению, это иногда случается

Если есть неуправляемые объекты, статические обработчики событий и некоторые управляемые коллекции, их необходимо очистить при утилизации. Какой способ решить, что должно входить и что выходить изif (disposing) пункт.

Распорядитесь методом.

// 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;
     }
 }

Это говорит управляемые объекты должны вif (disposing) который обычно выполняется только при явном вызове метода Dispose разработчиком. Если метод Finalize был реализован, и разработчик забыл вызвать метод Dispose, выполнение, которое приходит сюда через Finalizer, не выполняетсяif (disposing) раздел.

Ниже мои вопросы.

Если у меня есть обработчики статических событий, которые вызывают утечки памяти, где я должен отменить их регистрацию? В или изif (disposing) статья?

Если у меня есть некоторые коллекции, которые вызывают утечки памяти, где я должен их очистить? В или изif (disposing) статья?

Если я использую одноразовые объекты третьих сторон (например, элементы управления winExpress devExpress), я не уверен, являются ли они управляемыми или неуправляемыми объектами. Допустим, я хочу избавиться от них при утилизации формы. Как я могу узнать, что является управляемыми и что такое неуправляемые объекты? Быть одноразовым не говорит об этом? В таких случаях, как решить, что должно входить и что выходить изif (disposing) статья?

Если я не уверен, что что-то управляемое или неуправляемое, какие могут быть плохие последствия удаления / очистки / отмены регистрации событий изif (disposing) статья? Допустим, он проверяет нулевое значение перед удалением?

редактировать

То, что я имею в виду в качестве отмены регистрации события, выглядит примерно так: Publisher - это долгоживущий экземпляр, а нижняя строка находится в конструкторе подписчика. В этом случае подписчику необходимо отменить регистрацию события и распоряжаться перед издателем.

publisher.DoSomeEvent += subscriber.DoSomething;

Ответы на вопрос(6)

Ваш ответ на вопрос