В этом ответе я нашел,
Очистите неуправляемые ресурсы в методе Finalize и управляемые в методе Dispose, если в вашем коде используется шаблон Dispose/Finalize.
А потом я нашел эту хорошую статью о доработке и утилизации и получил четкое представление о них. В статье есть следующий код (страница 3), чтобы объяснить концепции:
class Test : IDisposable
{
private bool isDisposed = false;
~Test()
{
Dispose(false);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
// Code to dispose the managed resources of the class
}
// Code to dispose the un-managed resources of the class
isDisposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
Но ниже того же примечания (которое я включил в начало этого вопроса) появляется.
Шаблон Dispose/Finalize Microsoft рекомендует использовать как Dispose, так и Finalize при работе с неуправляемыми ресурсами. Тогда правильная последовательность будет для разработчика, чтобы вызвать Dispose. Реализация Finalize будет запущена, и ресурсы будут по-прежнему освобождаться, когда объект будет подвергаться сборке мусора, даже если разработчик не будет явно вызывать метод Dispose. Франческо Балена пишет в своем блоге: "Шаблон Dispose/Finalize следует использовать только тогда, когда ваш тип вызывает неуправляемый код, который выделяет неуправляемые ресурсы (включая неуправляемую память), и возвращает дескриптор, который вы должны использовать в конечном итоге для освобождения ресурса. связать их с родительскими объектами, вызывая их родительские методы после того, как они утилизировали или завершили свои собственные члены ". Проще говоря, очистите неуправляемые ресурсы в методе Finalize и управляемые в методе Dispose, когда в вашем коде используется шаблон Dispose/Finalize.
Теперь я снова в замешательстве. Во всей статье и в примере кода показано, что неуправляемые ресурсы должны быть освобождены в Dispose()
. Но тогда какова актуальность этого комментария?
Редактировать:
Как подтверждается, что эта строка:
Проще говоря, очистите неуправляемые ресурсы в методе Finalize и управляемые в методе Dispose, когда в вашем коде используется шаблон Dispose/Finalize.
Ошибочно, я редактировал этот ответ.