В this answer я нашел,Dispose() для очистки управляемых ресурсов?
Cleanup неуправляемые ресурсы в методе Finalize и управляемые из них в методе Dispose, когда Dispose/Доработка рисунок используется в вашем коде.
И позже я нашел this nice article о завершении и утилизации и получил четкое представление о них. Изделие имеет следующий код (Page 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 при работе с неуправляемыми ресурсами. Тогда правильная последовательность будет для того, чтобы разработчик мог вызвать Dispose. Реализация Finalize будет выполняться , и ресурсы будут освобождены, когда объект будет сбор мусора, даже если разработчик пренебрег вызовом метода Dispose явно. Франческо Балена пишет в своем блоге « Утилита Dispose/Finalize должна использоваться только тогда, когда ваш тип вызывает неуправляемый код, который выделяет неуправляемые ресурсы (в том числе неуправляемую память ) и возвращает дескриптор, который вы должны использовать в конечном итоге для освобождения ресурса. распоряжаться и финализировать, должны подключиться к своим родителям объектам, вызвав соответствующие методы их родителя после того, как они удалили или завершили свои собственные члены ». Проще говоря, очистите неуправляемые ресурсы в методе Finalize и управляемых в методе Dispose, когда в вашем коде был использован шаблон Dispose/Finalize .
Теперь я снова смущен. Во всей статье и в примере кода показано, что неуправляемые ресурсы должны быть освобождены в Dispose()
. Но в чем же смысл этого комментария?
Edit:
Как было подтверждено, что эта строка:
Проще говоря, очистки неуправляемые ресурсы в методе Finalize и управляемые из них в методе Dispose, когда Dispose/Доработка модель была использована в коде
является ошибочным, я редактировал this answer.
На самом деле вообще нет очистки управляемых ресурсов. Я не вижу его смысла. Максимум, который вы можете сделать для очистки управляемого ресурса, - это присвоить ему значение NULL. Что совершенно не нужно с такой хорошей GC встроенной. –
Thats статья, написанная в 2006 году, поэтому я бы не стал сильно беспокоиться об этом. –
Это не так просто. Вы также должны реализовать 'Dispose()', если вы создали и сохранили ссылку на * любой * объект типа, который реализует 'Dispose()' и который вы еще не выбрали. Некоторые типы не используют неуправляемые ресурсы, но у них есть такие вещи, как подписки на события, которые они должны отцеплять в своих методах 'Dispose(). Вы должны распоряжаться такими объектами ДАЖЕ, ЧЕМ, они не используют неуправляемые ресурсы, иначе вы можете иметь утечку памяти. Это часто особенно справедливо для классов пользовательского интерфейса, полученных из 'Control' или' UserControl'. –