从获取 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 语句之前定义事务,在括号内获取它的值,然后在括号之后返回。
在使用括号之外定义和返回变量会是更好的做法还是以任何方式节省资源?
不,我认为这样更清楚。不用担心,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);
}
}
看看这个
Understanding the 'using' statement in C#
CLR 将您的代码转换为 MSIL。并且 using 语句被转换为 try 和 finally 块。这就是使用语句在 IL 中的表示方式。 using 语句被翻译成三个部分:获取、使用和处置。首先获取资源,然后将使用情况包含在带有 finally 子句的 try 语句中。然后对象在 finally 子句中被释放。
从 using()
语句内部返回有没有副作用。
它是否使代码最易读是另一个讨论。
我想,都是一样的。代码中没有什么不好的。 .NET 框架不会关心对象是在哪里创建的。重要的是它是否被引用。
是的,可能会有副作用。例如,如果您在 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);
}
}
不定期副业成功案例分享