126

从获取 DataContext 的 using 语句中返回方法值似乎总是可以正常工作如下所示:

public static Transaction GetMostRecentTransaction(int singleId)
{
    using (var db = new DataClasses1DataContext())
    {
        var transaction = (from t in db.Transactions
                              orderby t.WhenCreated descending
                              where t.Id == singleId
                              select t).SingleOrDefault();
        return transaction;
    }
}

但是我总是觉得我应该在打破 using 括号之前关闭一些东西,例如通过在 using 语句之前定义事务,在括号获取它的值,然后在括号之后返回

在使用括号之外定义和返回变量会是更好的做法还是以任何方式节省资源?

4

5 回答 5

165

不,我认为这样更清楚。不用担心,Dispose仍然会被称为“出路”——并且只有完全评估了返回值之后。如果在任何时候抛出异常(包括评估返回值)Dispose仍然会被调用。

虽然您当然可以采取更长的路线,但这是两条额外的线路,只会添加杂乱无章和额外的上下文来跟踪(心理上)。事实上,你并不真的需要额外的局部变量——尽管它在调试方面很方便。你可以有:

public static Transaction GetMostRecentTransaction(int singleId)
{
    using (var db = new DataClasses1DataContext())
    {
        return (from t in db.Transactions
                orderby t.WhenCreated descending
                where t.Id == singleId
                select t).SingleOrDefault();
    }
}

事实上,我什至可能会想使用点表示法,并将Where条件放在SingleOrDefault:

public static Transaction GetMostRecentTransaction(int singleId)
{
    using (var db = new DataClasses1DataContext())
    {
        return db.Transactions.OrderByDescending(t => t.WhenCreated)
                              .SingleOrDefault(t => t.Id == singleId);
    }
}
于 2010-03-03T09:07:39.263 回答
32

看看这个

了解 C# 中的“使用”语句

CLR 将您的代码转换为 MSIL。并且 using 语句被转换为 try 和 finally 块。这就是使用语句在 IL 中的表示方式。using 语句被翻译成三个部分:获取、使用和处置。首先获取资源,然后将使用情况包含在带有 finally 子句的 try 语句中。然后对象在 finally 子句中被释放。

于 2010-03-03T09:08:11.210 回答
6

从语句内部返回没有副作用。using()

它是否使代码最易读是另一个讨论。

于 2010-03-03T09:08:27.547 回答
0

我想,都是一样的。代码中没有什么不好的。.NET 框架不会关心对象是在哪里创建的。重要的是它是否被引用。

于 2010-03-03T09:08:35.270 回答
-1

是的,可能会有副作用。例如,如果您在 ASP.NET MVC Action 方法中使用相同的技术,您将收到以下错误:“ObjectContext 实例已被释放,不能再用于需要连接的操作”

public ActionResult GetMostRecentTransaction(int singleId)
{
    using (var db = new DataClasses1DataContext())
    {
        var transaction = (from t in db.Transactions
                              orderby t.WhenCreated descending
                              where t.Id == singleId
                              select t).SingleOrDefault();
        return PartialView("_transactionPartial", transaction);
    }
}
于 2014-12-11T19:33:04.670 回答