Я работаю над фрагментом кода библиотеки около IDisposable
. Управляемый путь (через using
) легко тестируется. Я задаюсь вопросом о финализаторе, хотя: Является ли вызов System.GC.Collect()
достаточным для принудительного запуска финализатора?
Как unit test IDisposable?
Ответ 1
Нет, вызов GC.Collect() является асинхронным, вам также необходимо вызвать это:
System.GC.WaitForPendingFinalizers();
Ответ 2
Я бы посмотрел на Dispose, Finalization и Resource Management его лучшая ссылка на предмет, который я знаю. Используя их шаблон:
~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). Нет необходимости принудительно завершать или ничего использовать с помощью класса GC.
Ответ 3
Не могли бы вы издеваться над интерфейсом IDisposable
и ожидать вызова Dispose
? Это, по крайней мере, позволит вам увидеть, когда объект действительно расположен.
Ответ 4
Думаю, я бы склонялся к тому, чтобы заставить Finalize() вызвать другой метод и проверить, что другой метод делает то, что вы хотите. Вы не получите 100% -ный охват кода, но, по крайней мере, вы знаете, что метод правильно освобождает ресурсы объекта.