I am trying to create a general method for disposing an object that implements IDisposable, called DisposeObject()
To make sure I am disposing an object pointed by original reference, I am trying to pass an object by reference.
But I am getting a compilation error that says
The 'ref' argument type doesn't match parameter type
In the below (simplified) code, both _Baz
and _Bar
implement IDisposable.
So the questions are,
- Why am I getting this error?
- Is there a way to get around it?
[UPDATE]
From provided answers so far, as long as I do not set an IDisposable argument to null, I can simply pass an object by value without using ref
.
I am now having another trouble whether to set disposable objects to null
or not within DisposeObject
method.
Here is the full source for completeness:
public class Foo : IDisposable
{
private Bar _Bar;
private Baz _Baz;
private bool _IsDisposed;
~Foo() { Dispose(false); }
public void Dispose(bool disposing)
{
if (!_IsDisposed)
{
if (disposing)
{
DisposeObject(ref _Baz);
DisposeObject(ref _Bar);
}
}
_IsDisposed = true;
}
private void DisposeObject(ref IDisposable obj)
{
try
{
if (obj == null)
return;
obj.Dispose();
obj = null;
} catch (ObjectDisposedException) { /* Already Disposed... */ }
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
public class Bar : IDisposable
{
public void Dispose() {}
}
public class Baz : IDisposable
{
public void Dispose() {}
}
[RESULT]
I removed the code that sets argument to null (obj = null;
) within DisposeObject
So the final code became.
public void Dispose(bool disposing)
{
if (!_IsDisposed)
{
if (disposing)
{
DisposeObject(_Baz);
DisposeObject(_Bar);
}
}
_IsDisposed = true;
}
private void DisposeObject(IDisposable obj)
{
try
{
if (obj == null)
return;
obj.Dispose();
} catch (ObjectDisposedException) { /* Already Disposed... */ }
}