Я работаю над частью кода библиотеки вокруг IDisposable
. Управляемый путь (через using
) легко проверить. Однако меня интересует финализатор: достаточно ли вызова System.GC.Collect()
для принудительного финализатор запустить?
Как провести модульный тест IDisposable?
Ответы (4)
Нет, вызов GC.Collect() асинхронный, вам также нужно будет вызвать это:
System.GC.WaitForPendingFinalizers();
GC.Collect()
, а затем GC.WaitForPendingFinalizers();
и ни разу не disposing
никогда false
- person Matthew; 24.07.2019
Я бы посмотрел на удаление, завершение, и управление ресурсами это лучший справочник по теме, о которой я знаю. Используя их шаблон:
~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% покрытия кода, но, по крайней мере, будете знать, что метод правильно освобождает ресурсы объекта.