Today I got the following situation:
I had a base-class which was implementing the IDisposable pattern (including the GC.SuppressFinalize() part). From this class, I inherited a sub-class which also required doing some disposing stuff.
Now I asked myself how I should implement the IDisposable pattern correctly, that the dispose methods where not called twice (and throwing a ObjectDisposedException) and all my managed objects where disposed properly..
After some googling around I found a interesting blog-article:
http://reedcopsey.com/2009/03/30/idisposable-part-2-subclass-from-an-idisposable-class/
There it is clearly explained that you only have to override the Dispose(bool disposing) method (and that you do not require to implement the IDisposable interface)!
Small example:
You have the following base class:
/// <summary>
/// <see cref="IDisposable" /> interface example.
/// </summary>
public class Example : IDisposable
{
/// <summary>
/// Flag stating if the current instance is allready disposed.
/// </summary>
private bool _disposed;
/// <summary>
/// The <see cref="IDisposable" /> implementation.
/// </summary>
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize((object)this);
}
/// <summary>
/// Dispose method, releasing all managed resources.
/// </summary>
/// <param name="disposing">States if the resources should be disposed.</param>
protected virtual void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
if (disposing)
{
// Dispose all managed resources here.
}
_disposed = true;
}
}
If you now want to inherit a class from the above base-class, you have to implement the sub-class in the following way:
/// <summary>
/// SubClass of a <see cref="IDisposable" /> implementing base-class.
/// </summary>
public class SubExample : Example
{
/// <summary>
/// Flag stating if the current instance is allready disposed.
/// </summary>
private bool _disposed;
/// <summary>
/// Dispose method override, releasing all managed resources of the sub-class.
/// </summary>
/// <param name="disposing">States if the resources should be disposed.</param>
protected override void Dispose(bool disposing)
{
if (_disposed)
{
return;
}
if (disposing)
{
// Dispose all managed resources here.
}
_disposed = true;
base.Dispose(disposing);
}
}
That's it :)
If you have any suggestions or questions, feel free to write a comment! :)
Happy coding and have a nice weekend!
_1477.png)
_1485.png)