Вопрос

Я работаю над фрагментом библиотечного кода вокруг IDisposable . Управляемый путь (через using ) легко тестируется. Хотя мне интересно узнать о финализаторе: он звонит System.GC.Collect () достаточно для запуска финализатора?

Это было полезно?

Решение

Нет, вызов GC.Collect () является асинхронным, вам также необходимо вызвать его:

System.GC.WaitForPendingFinalizers();

Другие советы

Я хотел бы взглянуть на утилизировать , Завершение и управление ресурсами это лучшая ссылка на тему, которую я знаю. Используя их шаблон:

~ComplexCleanupBase()
{
    Dispose(false);
}

public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected override void Dispose(bool disposing)
{
   if (!disposed)
   {
        if (disposing)
        {
            // dispose-only, i.e. non-finalizable logic
        }

        // new shared cleanup logic
        disposed = true;
    }

    base.Dispose(disposing);
}

Вы попадаете в тупик с простыми методами Finalizer / Dispose () и тестируемым Dispose (bool). Нет необходимости форсировать Finalization или что-либо еще с помощью класса GC.

Не могли бы вы макетировать интерфейс IDisposable и ожидать вызова Dispose ? Это, по крайней мере, позволит вам увидеть, когда объект действительно будет удален.

Я думаю, я бы склонялся к тому, чтобы Finalize () вызывал другой метод, и проверял бы, что другой метод делает то, что вы хотите. Вы не получите 100% покрытия кода, но по крайней мере вы будете знать, что метод правильно высвобождает ресурсы объекта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top