.NET の多くのオブジェクト (SQLCommand
たとえば) は を実装していますIDisposable
。原則として、IDisposable
オブジェクトのインスタンスを作成した場合、常に破棄する必要がありますか?
5 に答える
はい、完了後にそれを必要としている発信者から受信している場合、または発信に責任を負っている場合を除きますDispose()
。重要なことは、誰かが電話Dispose()
をかけてきて、あなたがインスタンスを渡されたIDisposable
場合、あなたがその所有権を取得しているのか(したがってそれを処分する必要があるのか )、それとも「それを借りているのか」について理解(「契約」)する必要があるということです。 」 呼び出し元は、あなたが戻ったときにそれを使用/破棄します。これらは、優れたAPI のドキュメントに記載されているものの種類です。
オブジェクトをインスタンス化する場合は、 を使用して簡単に自動的に破棄できるようにしますusing
。
アイテムがスコープを失う前に必ず破棄してください。
最善の方法は、using
ステートメントを使用することです。または、手動で を呼び出すこともできますがDispose
、スコープが失われてガベージ コレクションの対象になる前に行います。
CA2000 : スコープを失う前にオブジェクトを破棄する
破棄可能なオブジェクトへのすべての参照がスコープ外になる前に、そのオブジェクトが明示的に破棄されない場合、ガベージ コレクターがオブジェクトのファイナライザーを実行するとき、オブジェクトは不確定な時点で破棄されます。オブジェクトのファイナライザーの実行を妨げる例外的なイベントが発生する可能性があるため、代わりにオブジェクトを明示的に破棄する必要があります。
原則として、はい。これを行う最も簡単な方法は、通常、using
ステートメントを使用することです。
ほとんどの場合そうですが、借りたものを処分すると問題が発生する可能性がある場合の例を次に示します。1 つは DbContext を受け取り、もう 1 つは DbContext 自体を作成する既定のコンストラクターです。リポジトリが破棄されるインスタンスに遭遇し、DbContext の破棄がトリガーされました (指示したため)。コードの他の場所で渡された DbContext がまだ必要であるため、問題が発生することがありました。
この場合、リポジトリは DbContext を作成し、それに対して責任を負い、それを破棄する必要があります。これは、他のコードではできないためですが、DbContext が他のコードによって渡された場合、DbContext の破棄は、作成したコードの責任である必要があります。それ。
すべてのシナリオで必須ではありませんが、オブジェクトを破棄することをお勧めします。オブジェクトごとにそれを行いたくない場合は、using {}
使い捨てが実装されているものを使用してください。コードブロックが終了すると、オブジェクトの破棄が処理されます。