この問題や他の多くの問題に関する私の哲学は、「理にかなったことをする」ことです。
場合によっては、クラスがそのリソースを解放した後に特定のクラス メンバーを使用することが非常に合理的な場合があります。実際、一部のシナリオではそのような使用が必要になる場合があります。たとえば、オブジェクトがネットワーク接続を介して非同期トランザクションを管理している場合、シャットダウンするように要求し、シャットダウンした後、処理されたトランザクションの数、ぶら下がっているトランザクションが残っていないかなどを尋ねます。このような統計の値は、シャットダウンが完了するまで知ることができず、概念的には、オブジェクトにシャットダウンを要求してから、オブジェクトが既に実行したことに関する履歴情報を要求することに問題はありません。
Close
歴史的な情報を報告するプロパティの使用を許可する一方で、接続をシャットダウンする必要があると主張する人もいるかもしれませんがDispose
、物事をシャットダウンしてそのようなプロパティの使用を禁止する必要がありますが、私はそのような区別は役に立たないと考えています. とりわけ、接続がそれに関連付けられているすべてのリソースを解放することを望む場合があります ( Close
「再開」要求を許可するために、何かが実行を控える場合があります)。さらに、 と の間に他に動作の違いがない場合、純粋に 2 つの別個のメソッドを必要とする必要はないと思うのでClose
、統計データが無効になる可能性があります。Dispose
Dispose
ある意味では、多くのIDisposable
オブジェクトは、外部リソースと対話するエンティティと、マネージ コードと対話し、それ自体で機能が制限されている可能性があるエンティティの 2 つの部分を持つと見なすことができます。「関心の分離」の原則は、2 つの部分を別々のオブジェクトにすることを示唆していますが (実際、そのような分割が役立つ場合があります)、多くの場合、クライアント コードは単一の参照を保持する必要があります。両方の目的を果たします。その参照は を実装するIDisposable
必要がありますが、破棄によってマネージ コード側が破壊されることはありません。
例として、WinFormsFont
クラスを考えてみましょう。このクラスは、(1) フォントに関する情報のコレクション (書体、サイズ、スタイルなど)、および (2) GDI フォント ハンドルの 2 つをカプセル化します。aFont
がDispose
d の場合、テキストの描画には使用できなくなりますが、書体やスタイルなどは忘れられませんDispose
。d フォントが与えられた場合、古いフォントの情報を使用して新しいフォントを構築することができます。残念ながら、そのような情報を読み取ることを可能にするプロパティのほとんどは、 によって明示的に無効化されてDispose
います。つまり、多くの場合、既存のものに似ているが廃棄されFont
ているが、いくつかの変更を加えたフォントを作成したい場合は、古いフォントから情報をコピーして新しいフォントを構築し、そのフォントに基づいて別の新しいフォントを構築し、Dispose
最初に作成された新しいフォント。フォントの説明を保持したいがFontDescription
GDI ハンドルを必要としない場合に、フォントの説明を-使い捨てクラスですが、それはクラスの設計方法ではありません。