Class instances often encapsulate control over resources not managed by the runtime (Hwnds, Database connections etc). There needs to be both an explicit and an implicit way to free those resources. The implicit control is provided by implementing the protected method Finalize() on Object. The GC calls this method when there are no longer any valid references to the object. The explicit control is provided by a Dispose() method. This method must be called by the consumer of the object, and can be done even if other references to the object are alive.
void Dispose() { Finalize(); GC.SuppressFinalize(this); }