14

SOに関する Q&A はたくさんありますがIDisposable、私はまだこれに対する答えを見つけていません。

私は通常、クラスの 1 つがIDisposableオブジェクトを所有している場合、所有しているオブジェクトも実装IDisposableして呼び出すという慣行に従いDisposeます。IDisposableしかし最近、明示的に実装されたクラスに出くわしたため、直接呼び出しDisposeて強制的にキャストすることができず、迷惑で不要であることがわかりました。

では、質問: の明示的なインターフェイス実装を使用する理由と時期はIDisposable? インターフェイスを明示的に実装するための完全に適切で正当な理由があることは知っていますが、IDisposableその理由に関しては私にははっきりしていません。

4

3 に答える 3

16

IDisposable.Dispose別の同等のメソッド (Close など) がない限り、 を明示的に実装するのは珍しいことだと思います。

その場合、ラッパー クラスはキャストではなく Close を呼び出すことができます。

例はWebResponse、Framework <= V3.5 のクラスです。興味深いことに、.NET 4 にはパブリックの Dispose メソッドがあるため、Microsoft は、明示的な実装は適切ではないと判断した可能性があります。

CLR セキュリティ チームの設計エンジニアである Shawn Farkas は、MSDN マガジンに次のように書いています。

using ブロックは明示的な IDisposable 実装を持つクラスで機能しますが、クラスがこの方法でインターフェイスを実装しないことをお勧めします。IDisposable を明示的に実装すると、Visual Studio® で IntelliSense® を使用してオブジェクト モデルを探索している開発者は、オブジェクトに Dispose メソッドがあることに気付かないでしょう。

于 2011-04-07T07:12:14.737 に答える
1

それは良い習慣だと思います.(IDisposableにキャストしたい場合を除いて!!)

using (ClassWithIDisposable) {
}

Dispose は例外が発生した場合でも呼び出されます

また、castle や unity などの IOC フレームワークを使用する場合、IDisposable をインターフェイスに継承して呼び出せるようにする必要があります。これらのフレームワークは、AOP を可能にします。これにより、ソリッド クラスへの参照はなく、インターフェイスのみ......

于 2011-04-07T07:20:56.630 に答える
1

私見、クラスが IDisposable を明示的に実装する適切な理由は 1 つだけです。それは、誰も実際に呼び出す必要がないと予想される場合です。クラスが IDisposable を明示的に実装しているという事実は、必ずしも派生クラスのオブジェクトである必要はありませんが、その特定のクラスのオブジェクトを安全に作成し、それを使い終わったら単に破棄できるという指標と見なすことができます。特定のクラスで直接利用できる Dispose メソッドがないことは、その特定のクラスであることがわかっているオブジェクトで Dispose を呼び出す必要がないことを示していると見なすことができます。

IDisposable を実装するオブジェクトへの参照を持っていて、それが実装されていることに気付かずに使用しても問題ないことに注意してください。ただし、そのようなオブジェクトの所有権を取得することはできます。戻り値の型が IDisposable.Dispose で何もせず、それを明示的に実装するが、適切な Disposal を期待するオブジェクトを返す場合があるファクトリ メソッドは、リークの原因となります。このようなファクトリ メソッドの戻り値の型として使用される可能性がある場合、クラスは IDisposable を明示的に実装しないでください。

個人的には、必要かどうかにかかわらず、IDisposable を実装するすべてのオブジェクトを Dispose する傾向があります。それにもかかわらず、特定のタイプの IDisposable オブジェクトを知っておくと、適切な破棄を保証することが困難または厄介な場合に非常に役立つ場合があります。

于 2011-04-16T19:18:23.367 に答える