Я пытаюсь создать общий метод для удаления объекта, который реализует IDisposable , называемый DisposeObject()
Чтобы убедиться, что я удаляю объект, указанный исходной ссылкой, я пытаюсь передать объект по ссылке.
Но я получаю ошибку компиляции, которая говорит
Тип аргумента 'ref' не соответствует типу параметра
В приведенном ниже (упрощенном) коде оба _Baz
и _Bar
реализуют IDisposable .
Итак, вопросы,
- Почему я получаю эту ошибку?
- Есть ли способ обойти это?
[UPDATE]
Из предоставленных ответов до тех пор, пока я не установлю аргумент IDisposable в значение null, я могу просто передать объект по значению без использования ref
.
У меня теперь есть другая проблема, устанавливать ли одноразовые объекты на null
или нет в методе DisposeObject
.
Вот полный источник полноты:
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() {}
}
[РЕЗУЛЬТАТ]
Я удалил код, который устанавливает аргумент в null (obj = null;
) в DisposeObject
Таким образом, окончательный код стал.
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... */ }
}