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