从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; } } 

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

在使用括号之外定义和返回variables是否更好地实践或节约资源?

不,我认为这样更清楚。 不要担心, Dispose仍然会被称为“中途退出” – 只有返回值被充分评估之后。 如果在任何时候抛出exception(包括评估返回值), Dispose仍然会被调用。

虽然你当然可以采取更长的路线,这是两个额外的线路,只是添加cruft和额外的上下文来跟踪(精神)。 事实上,你并不需要额外的局部variables – 尽pipe在debugging方面它可以很方便。 你可以只有:

 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); } } 

看看这个

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

CLR将您的代码转换为MSIL。 使用语句被翻译成try和finally块。 这是在IL中如何使用陈述。 使用说明被翻译成三部分:采集,使用和处理。 首先获取资源,然后将这个用法包含在带有finally子句的try语句中。 然后该对象被放置在finally子句中。

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

它是否使得最可读的代码是另一个讨论。

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

是的,可能会有副作用。 例如,如果您在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); } }