В .NET сборщик мусора автоматически освобождает память, когда на объект больше нельзя ссылаться откуда-либо. Когда это происходит, если у объекта есть финализатор, он вызывает финализатор. Финализатор предназначен для очистки, как правило, неуправляемых ресурсов.
Однако финализаторы стоят дорого (например, они задерживают сборку мусора на объекте), и вы не можете сказать, когда он будет запущен (как вы не можете сказать, когда GC решит его собрать). Их обычно оставляют в качестве последнего средства для очистки таких вещей, как неуправляемые ресурсы.
Именно здесь вступает интерфейс IDisposable и его метод Dispose. Dispose также может использоваться для очистки как управляемых, так и неуправляемых ресурсов. Когда вы вызываете метод Dispose, он очищается, и объект больше не находится в стабильном и пригодном для использования состоянии.
Если у вас есть ресурс, который реализует IDisposable, вы можете вызвать Dispose, когда вы знаете, что все готово. Таким образом и ресурсы, за которые он держится, могут быть освобождены как можно скорее. Обычный способ сделать это состоит в том, чтобы заключить его в оператор using, который автоматически удалится после завершения использования блока. e.g.:
using (SomeDisposableObject disposableObject = new SomeDisposableObject())
{
disposableObject.DoSomeStuff();
disposableObject.DoSomeMoreStuff();
}
Когда использование блока завершено (после DoMoreStuff) Dispose вызывается для одноразового объекта. Использование операторов намного чище, чем эквивалентный код, если принять во внимание обработку исключений.
В случае чего-то вроде всплывающей подсказки, которая имеет неуправляемые ссылки (множество WinForms в оболочке вокруг неуправляемых компонентов Win32), она будет иметь финализатор, обеспечивающий вдвойне уверенность в том, что неуправляемые ресурсы освобождаются правильно. Однако, если вы вызываете Dispose для объекта, тут же запускается код очистки, и финализатор подавляется (он не запускается, когда объект собирается GC).
Итак, чтобы ответить на ваш вопрос более прямо, если вы точно знаете, когда заканчивается IDisposable, неплохо было бы позвонить в Dispose. Однако, если вы этого не сделаете, то обычно нормально оставить его на сборщик мусора, чтобы собрать его и вызвать соответствующий код для правильной очистки объекта.
В тех случаях, когда были даны всплывающие подсказки и таймер, я не стал бы беспокоиться о том, чтобы вызывать на них Dispose самостоятельно, так как подозреваю, что будет сложно предсказать, когда они будут закончены.