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

根据您的“功能”需要多长时间并且您不需要上下文,第二个更好。

读这个

我们实施 IDisposable 有几个原因:

如果应用程序逻辑需要在预期使用或有效 DataContext 之后保留实体,则可以通过调用 Dispose 来强制执行该合同。该实体中的延迟加载程序仍将引用 DataContext,并且如果任何代码尝试导航延迟属性,则将尝试使用它。这些尝试都会失败。Dispose 还强制 DataContext 转储其物化实体的缓存,以便单个缓存实体不会意外地使通过该 DataContext 物化的所有实体保持活动状态,否则会导致看似内存泄漏的情况。

自动关闭 DataContext 连接的逻辑可能会被欺骗,使连接保持打开状态。DataContext 依赖于枚举查询的所有结果的应用程序代码,因为到达结果集的末尾会触发连接关闭。如果应用程序使用 IEnumerable 的 MoveNext 方法而不是 C# 或 VB 中的 foreach 语句,则可以提前退出枚举。如果您的应用程序遇到连接未关闭的问题并且您怀疑自动关闭行为不起作用,您可以使用 Dispose 模式作为解决方法。您不需要它们。

更多信息

于 2012-09-20T16:14:56.593 回答