2012-02-09 19 views
0

さまざまな種類のデータオブジェクトを扱う場合、多くの場合、それらを破棄してデータベース接続を開いたままにしないようにすることが重要です。ただし、テーブルアダプタは、切断されたデータの原則に基づいて構築されているため、この問題の影響を受けないように見えます。私は、例外の存在下であっても、原子充填または更新メソッドが完了した後にテーブルアダプタが常に接続を閉じるという印象を受けています。これは正しいです?テーブルアダプターを廃棄する理由はありますか?

一方、テーブルアダプタではIDisposableが実装されているため、ある時点でクリーンアップするための管理されていないリソースが必要です。それとも人々が書くことができるようにこれだけの式です:

using(var a = new MyTableTableAdapter()) 
{ 
    a.Fill(ds.MyTable); 
} 

このトピックについて考える必要はありませんか?

+0

それについて考えないでください。 –

+0

これは基本的に、それはあなたのパフォーマンスを傷つけることはありませんし、2番目のフレームワークを推測の心配を保存します! –

答えて

2

IDisposableを実装している場合は、現在処分するリソースを保持しているか、将来的にそれを保持する可能性があります。それが使い捨てであれば、処分する必要があります。それはあなたが内部であることを理解することではなく、それが契約であり、それを尊重することを理解することだけです。一般的に、人々は式典から物事をしません - "使用する"は文法的には涼しいですが、処分する資源を持たないクラスの周りにIDisposableを振りかけるのに十分冷たくないです:)

また、IDisposableは必ず「管理されていない」リソースを意味します。これは、ガベージコレクションされたオブジェクト(メモリ)ではないリソース(ファイルハンドル、ネットワーク接続など)があることを意味します。この区別は、管理されていないものではなく、収集されないもののクリーンアップです。 多くの場合、のリソースの多くは、管理されていないOSリソースによってバックアップされています。

EDIT:

例えば

、のは、私はオンデマンドでプール(キャッシュ)からいくつかの他のオブジェクトを取得し、完全に管理対象オブジェクトを作成し、あなたがそれを使用して行われているとき、私はそれがそれらのオブジェクトを配置したいとしましょうプールに何かを追加するための明示的な呼び出し。ここで管理されていないものはありませんが、プールからオブジェクトを要求に応じて引き出し、他の人が使用できるようにプールに戻すことができます(Pool.Add)。あなたは消費者が私のオブジェクトを単に使用して、それが処理されるときれいになることを知っているでしょう。決めるのを待つべきではないので、明示的に処分する必要があります(後で起こるかもしれないし、まったく起こらないかもしれません) -

+0

ファイルハンドルとネットワーク接続が管理されていませんか?最新のドキュメントの引用は次のとおりです。「このインターフェイスの主な用途は、管理されていないリソースを解放することです。 http://msdn.microsoft.com/en-us/library/system.idisposable.aspxを参照してください。 –

+0

インターフェイスが作成された理由は、ガベージコレクションがオブジェクト/メモリを収集するためであったため、「クリーンアップ」することでした。私が言ったように、これらのオブジェクトは、最終的に管理されていないOSリソースによってバックアップされることがよくありますが、誰もが "プライマリ"と "頻繁に"と言っていることを認識しています。最終的に、それはあなたが終わったときに物事を取り除くことです - きれいにする。 – bryanmac

+0

たとえば、プールから他のいくつかのオブジェクトを取得した完全に管理されたオブジェクトを作成し、それを使用したら、それらのオブジェクトを共有プールに戻すことを望みます。解放されません。プールに何かがありますが、ここでは管理されていないものはありませんが、私はプールからオブジェクトを要求に応じて引き出し、他の人が使用できるようにプールに戻すことができます。私たちはファイナライズを待つべきではないので、明示的に処分する必要があります(あとで起こるかもしれないし、まったく起こらないかもしれません) – bryanmac

関連する問題