Если вы пишете класс со ссылками на файлы/изображения, вы несете ответственность за предоставление механизма для их выпуска.
Для всех приложений .NET (а не только для WinForms) реализация IDisposable для любого типа, содержащего ссылки на большие ресурсы файла/памяти, всегда является хорошим началом.
Если вы используете типы фреймворков, которые обращаются к ресурсам, то, как говорят другие, используемые блоки являются изящным решением.
Также возможно заставить сборщик мусора утилизировать типы в то время, когда вы просите его сделать это (детерминированным), однако настоятельно рекомендуется, чтобы вы этого не делали, и вместо этого разрешите сборщику мусора решить для повышения производительности и управления памятью.
Наконец, поскольку фактическое обращение к Dispose (напрямую или через использование) выполняется пользователем ваших типов, необходимо четко документировать это (комментарии XML и т. Д.).
Посмотрите этот earlier SO question гораздо более подробно
Как насчет того, будет ли код внутри блока использования исключать? – MichaelD
Используя блок использования, вы гарантируете, что ресурс будет удален, даже если в блоке использования возникает исключение. – Llyle
Используемый блок переводится компилятором в блок try..finally с вызовом foo.Dispose() в конце. Таким образом, компилятор гарантирует, что Dispose будет вызываться, даже если ваш код генерирует исключение. –