When there is some non-managed reference to dispose - database connections, file handles, and so on -- or if you have a reference to a library that implements IDisposable.
Most user-defined classes DO NOT need to implement IDisposable.