28

DB を処理するいくつかのメソッドがあり、それらはすべて呼び出すことから始まります

FaierDbDataContext db = new FaierDbDataContext();

Linq2Sql DataContext オブジェクトは IDisposable を実装しているため、これを "using" で使用する必要がありますか?

using (FaierDbDataContext db = new FaierDbDataContext()) {
    // use db here
}

何らかの方法でそれを使用することの意味は何ですか?

4

1 に答える 1

29

IDisposable を実装するほとんどの型とは異なり、DataContext は破棄する必要はありません (少なくともほとんどの場合)。この設計上の決定について Matt Warren に尋ねたところ、彼の回答は次のとおりです。

IDisposable を実装した理由はいくつかあります。

  • アプリケーション ロジックが、DataContext が使用または有効であると予想される期間を超えてエンティティを保持する必要がある場合は、Dispose を呼び出してそのコントラクトを強制できます。そのエンティティの遅延ローダーは引き続き DataContext を参照し、コードが遅延プロパティをナビゲートしようとすると、それを使用しようとします。これらの試みは失敗します。また、Dispose は、DataContext に実体化されたエンティティのキ​​ャッシュを強制的にダンプさせます。これにより、1 つのキャッシュされたエンティティが、その DataContext を介して実体化されたすべてのエンティティを誤って存続させないようにします。そうしないと、メモリ リークのように見える原因となります。
  • DataContext 接続を自動的に閉じるロジックは、だまされて接続を開いたままにすることができます。結果セットの最後に到達すると接続が閉じられるため、DataContext はクエリのすべての結果を列挙するアプリケーション コードに依存します。アプリケーションが C# または VB の foreach ステートメントの代わりに IEnumerable の MoveNext メソッドを使用する場合、列挙を早期に終了できます。アプリケーションで接続が閉じないという問題が発生し、自動閉じ動作が機能していないと思われる場合は、回避策として Dispose パターンを使用できます。

ソースから

于 2009-05-04T19:30:52.223 に答える