You do not have to use the heavy-weight ("painful") Dispose+Finalizer pattern on a IDisposable class, if the class is sealed, and the class has no unmanaged resources.
In that situation, you can use a subset of the Dispose+Finalizer pattern, which just has public
Dispose(), has no finalizer, and the class is sealed.
The reason for sealing the class is to avoid the problems of "What if a child class has unmanaged resources?" and "What if a child class in the future will have unmanaged resources?"
Joe Duffy, formerly of Microsoft, has a lengthy (30+ page) article that discusses how to correctly implement
IDisposable, and all the permutation subset implementations.
Contributors to the article include Herb Sutter, Brian Grunkemeyer, Jeff Richter, and other C# luminaries. The article is much more in-depth than what is presented on MSDN.
Alas, Joe Duffy's new blog engine has not done a good job of preserving the original article from 2005, so it looks somewhat munged. Here is the link: http://joeduffyblog.com/2005/04/08/dg-update-dispose-finalization-and-resource-management/
I wish I could attach my MS-Word document that has the entirety of Joe Duffy's article in a much better format. :-(