从using()语句中返回是否有任何副作用?

时间:2010-03-03 09:06:08

标签: c# using

内部返回一个方法值,一个获取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;
    }
}

但在我突破使用括号之前,我总是觉得我应该关闭某些东西,例如通过在使用语句之前定义事务,在括号中获取 值,然后在括号后返回

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

5 个答案:

答案 0 :(得分:151)

不,我觉得这样更清楚。不用担心,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);
    }
}

答案 1 :(得分:29)

看看这个

Understanding the 'using' statement in C#

  

CLR将您的代码转换为MSIL。   而using语句得到了   转化为尝试,最后   块。这是使用声明的方式   在IL中有代表。一个使用   声明被翻译成三个   部分:获取,使用和   处置。资源是第一位的   获得,然后使用是封闭的   在一个带有finally的try语句中   条款。然后对象被处置掉   在finally子句中。

答案 2 :(得分:4)

using()语句中返回有副作用。

是否制作最易读的代码是另一种讨论。

答案 3 :(得分:0)

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

答案 4 :(得分:-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);
    }
}