0

このコードを考えると:

/// <summary>
/// Add to view count of this article
/// </summary>
public static void IncrementViewCount(int articleID)
{
    using (var db = new MainContext())
    {
        var q = (from c in db.tblArticles where c.ID == articleID select c).SingleOrDefault();
        if (q != null)
        {
            q.Views ++;
            db.SubmitChanges();

            if (q.Views == 500)
            {
                // Call function
            }
        }
    }
}

以下のように書いた方がよいでしょうか。

/// <summary>
/// Add to view count of this article
/// </summary>
public static void IncrementViewCount(int articleID)
{
    var newViews = 0;
    using (var db = new MainContext())
    {
        var q = (from c in db.tblArticles where c.ID == articleID select c).SingleOrDefault();
        if (q != null)
        {
            newViews = q.Views + 1;
            q.Views = newViews;
            db.SubmitChanges();
        }
    }
    if (newViews == 500)
    {
        // Call function
    }
}

例 2 では、using ブロックが以前の時点で閉じられていることに注意してください。

4

1 に答える 1

1

「関数」にかかる時間とコンテキストが必要ない場合は、2 番目の方が優れています。

これを読む

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

アプリケーション ロジックが、DataContext が使用または有効であると予想される期間を超えてエンティティを保持する必要がある場合は、Dispose を呼び出してそのコントラクトを強制できます。そのエンティティの遅延ローダーは引き続き DataContext を参照し、コードが遅延プロパティをナビゲートしようとすると、それを使用しようとします。これらの試みは失敗します。また、Dispose は、DataContext に実体化されたエンティティのキ​​ャッシュを強制的にダンプさせます。これにより、1 つのキャッシュされたエンティティが、その DataContext を介して実体化されたすべてのエンティティを誤って有効にしておくことがなくなります。そうしないと、メモリ リークのように見える原因となります。

DataContext 接続を自動的に閉じるロジックは、だまされて接続を開いたままにすることができます。結果セットの最後に到達すると接続が閉じられるため、DataContext はクエリのすべての結果を列挙するアプリケーション コードに依存します。アプリケーションが C# または VB の foreach ステートメントの代わりに IEnumerable の MoveNext メソッドを使用する場合、列挙を早期に終了できます。アプリケーションで接続が閉じないという問題が発生し、自動閉じ動作が機能していないと思われる場合は、回避策として Dispose パターンを使用できます。それらは必要ありません。

詳しくは

于 2012-09-20T16:14:56.593 に答える