私はインターフェイスの実装を持っており、そのインターフェイスはIDisposable
に拡張されています。インターフェイスの私の特定の実装では、私は何も配置する必要はありませんので、空のDispose()
メソッドがあります。実装が空のメソッドの場合、Dispose()(FxCopに準拠)を「適切に」実装するにはどうすればよいですか? (CA1063)
public interface IMyStuff : IDisposable
{
}
public MyStuffImpl : IMyStuff
{
public void Dispose()
{
}
}
、これはCA1063その結果:だから
Error, Certainty 95, for ImplementIDisposableCorrectly
{
Resolution : "Provide an overridable implementation of Dispose(
bool) on 'MyStuffImpl' or mark the type as sealed.
A call to Dispose(false) should only clean up native
resources. A call to Dispose(true) should clean up
both managed and native resources."
}
CriticalWarning, Certainty 75, for CallGCSuppressFinalizeCorrectly
{
Resolution : "Change 'MyStuffImpl.Dispose()' to call 'GC.SuppressFinalize(
object)'. This will prevent derived types that introduce
a finalizer from needing to re-implement 'IDisposable'
to call it."
}
Error, Certainty 95, for ImplementIDisposableCorrectly
{
Resolution : "Modify 'MyStuffImpl.Dispose()' so that it
calls Dispose(true), then calls GC.SuppressFinalize
on the current object instance ('this' or 'Me' in Visual
Basic), and then returns."
}
、私は2のいずれかの方法でこれを解決することができますように見えます:
クラスsealed
を作ります:
public sealed MyStuffImpl : IMyStuff
{
public void Dispose()
{
}
}
典型的なパターンの一部実装します。私の場合は
public MyStuffImpl : IMyStuff
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
}
}
を、私が今までに延長され、この実装を計画していないので、私はおそらくそれsealed
することによってそれを解決しますが、私は認めます私はそれが封印されているかどうか、それがなぜ重要か理解できません。
また、私のクラスが封印されているので、FxCopはもはやDispose()
がGC.SupressFinalize(this);
を呼び出すはずですが、それは本当に本当ですか?それは、.NETでは、DisplacementのSupressFinalizeを常に呼び出すだけでよいのですか?
おそらく、あなたのインタフェースは、処分する必要のないものを実装するものがあれば、IDisposableを実装すべきではありません。必要に応じて、インタフェースにIDisposable *を実装することもできます。 –
@DBM OPはIDisposableを継承する別のインターフェイスを実装しています。 'IEnumerator'は一例です。 –
phoog
@ DBM:ほとんどの実装が使い捨てである場合、このインタフェースは、インタフェースのユーザが正しく処分するようにする必要があります。 – SLaks