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

Edw*_*uay 124 c# using

返回从方法值 using语句是得到一个DataContext似乎总是工作精细,就像这样:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

将变量定义并返回到使用括号之外是更好的做法还是以任何方式保存资源?

Jon*_*eet 161

不,我觉得这样更清楚.不用担心,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();
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,我甚至可能会想要使用点符号,并将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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是.使用是try/finally结构的简单语法糖 (5认同)
  • 正确的是@jon,如果在使用块中抛出异常,它仍然是安全的吗? (2认同)
  • 为什么将OrderByDescending与SingleOrDefault结合使用? (2认同)
  • @erikkallen:不幸的是,LINQ没有"MaxBy" - 因此你无法获得具有最大值的行.对于LINQ to Objects,你可以很容易地编写自己的对象,但在这种情况下我不确定是否有更好的方法.你会建议什么呢? (2认同)

Adr*_*der 31

看看这个

理解C#中的'using'语句

CLR将您的代码转换为MSIL.而using语句被转换为try和finally块.这就是在IL中表示using语句的方式.使用声明分为三个部分:获取,使用和处置.首先获取资源,然后将使用情况包含在带有finally子句的try语句中.然后该对象将被置于finally子句中.

  • 一个有趣的见解.谢谢. (4认同)
  • 不,最终将永远被召唤.http://www.techinterviews.com/interview-questions-for-c-developers (3认同)

Mit*_*eat 6

没有从内返回的副作用using()声明。

它是否使代码更具可读性是另一个问题。