IDisposableを実装するオブジェクトを破棄するための一般的なメソッドを作成しようとしています。DisposeObject()
元の参照が指すオブジェクトを破棄していることを確認するために、オブジェクトを参照渡ししようとしています。
しかし、私は言うコンパイルエラーが発生しています
'ref' 引数の型がパラメーターの型と一致しません
以下の (簡略化された) コードでは、 と の両方がIDisposable_Baz
を_Bar
実装しています。
質問は、
- このエラーが発生するのはなぜですか?
- それを回避する方法はありますか?
[更新]
これまでに提供された回答から、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... */ }
}