Si vous écrivez la classe qui fait référence à des fichiers/images, il est de votre responsabilité de fournir un mécanisme pour leur publication.
Pour toutes les applications .NET (pas seulement WinForms), implémenter IDisposable sur tout type qui contient des références à de grandes ressources de fichiers/mémoire est toujours un bon début.
Si vous utilisez des types de framework qui accèdent aux ressources, alors comme d'autres l'ont dit, les blocs using sont une solution élégante.
Il est également possible de forcer le garbage collector à disposer des types au moment où vous le demandez (déterministe), mais il est fortement recommandé de ne pas le faire et de permettre au garbage collector de décider lui-même à la fois pour améliorer les performances et la gestion de la mémoire.
Enfin, parce que l'appel de Dispose (directement ou via l'utilisation) est fait par l'utilisateur de vos types, il est essentiel de documenter clairement cela (commentaires XML, etc.).
Voir cette earlier SO question pour beaucoup plus de détails
Que se passe-t-il si le code à l'intérieur du bloc using génère une exception? – MichaelD
En utilisant le bloc using, vous vous assurez que la ressource sera éliminée, même si une exception se produit dans le bloc using. – Llyle
Le bloc using est traduit par le compilateur dans un bloc try..finally avec un appel à foo.Dispose() dans le dernier. De cette façon, le compilateur garantit que Dispose sera appelé même si votre code génère une exception. –