A
Andreas Huber
Hi there
Is there a reason why .NET framework base classes implementing IDisposable
(like e.g. System.ComponentModel.Component) do not prevent multiple calls to
the protected virtual void Dispose( bool disposing ) function?
Derived classes would then no longer need to check whether they have been
disposed already and the associated bool member wouldn't be necessary
either.
Example code:
class Base : IDisposable
{
private bool disposed = false;
~Base()
{
if ( !this.disposed ) // *** here ***
{
Dispose( false );
this.disposed = true;
}
}
public void Dispose()
{
if ( !this.disposed ) // *** here ***
{
Dispose( true );
GC.SuppressFinalize( this );
this.disposed = true;
}
}
public void SomeMethod()
{
if ( this.Disposed )
{
throw new ObjectDisposedException( "Base" );
}
// ...
}
// This property is necessary so that subclass methods can check whether
// the object has been disposed.
protected bool Disposed
{
get { return this.disposed; }
}
protected virtual void Dispose( bool disposing )
{
if ( disposing )
{
// release my managed resources
}
// release my unmanaged resources
}
}
class Derived : Base
{
public void SomeOtherMethod()
{
if ( this.Disposed )
{
throw new ObjectDisposedException( "Derived" );
}
// ...
}
protected override void Dispose( bool disposing )
{
try
{
if ( disposing )
{
// release my managed resources
}
// release my unmanaged resources
}
finally
{
base.Dispose( disposing );
}
}
}
Is there a reason why .NET framework base classes implementing IDisposable
(like e.g. System.ComponentModel.Component) do not prevent multiple calls to
the protected virtual void Dispose( bool disposing ) function?
Derived classes would then no longer need to check whether they have been
disposed already and the associated bool member wouldn't be necessary
either.
Example code:
class Base : IDisposable
{
private bool disposed = false;
~Base()
{
if ( !this.disposed ) // *** here ***
{
Dispose( false );
this.disposed = true;
}
}
public void Dispose()
{
if ( !this.disposed ) // *** here ***
{
Dispose( true );
GC.SuppressFinalize( this );
this.disposed = true;
}
}
public void SomeMethod()
{
if ( this.Disposed )
{
throw new ObjectDisposedException( "Base" );
}
// ...
}
// This property is necessary so that subclass methods can check whether
// the object has been disposed.
protected bool Disposed
{
get { return this.disposed; }
}
protected virtual void Dispose( bool disposing )
{
if ( disposing )
{
// release my managed resources
}
// release my unmanaged resources
}
}
class Derived : Base
{
public void SomeOtherMethod()
{
if ( this.Disposed )
{
throw new ObjectDisposedException( "Derived" );
}
// ...
}
protected override void Dispose( bool disposing )
{
try
{
if ( disposing )
{
// release my managed resources
}
// release my unmanaged resources
}
finally
{
base.Dispose( disposing );
}
}
}