Есть ли какие-либо побочные эффекты возврата изнутри инструкции using()?
Возврат значения метода из внутри. Оператор using, получающий DataContext, всегда работает fine, например:
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, присвойте ей значение внутри скобок, а затем верните после скобки.
Определяли бы и возвращали бы переменную за пределами скобок использования лучше всего или сохраняли бы ресурсы каким-либо образом?
Ответы
Ответ 1
Нет, я думаю, что это яснее. Не волнуйтесь, 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);
}
}
Ответ 2
Посмотрите на это
Понимание инструкции 'using' в С#
CLR преобразует ваш код в MSIL. И выражение using переведенный в попытку и, наконец, блок. Вот как используется оператор using представлен в IL. Использование выражение переведено на три частей: приобретение, использование и удаление. Сначала ресурс приобретается, то использование прилагается в заявлении try с окончательным пункт. Затем объект удаляется в предложении finally.
Ответ 3
Есть побочные эффекты нет, возвращаемые из инструкции using()
.
Является ли он самым читаемым кодом, является другим обсуждением.
Ответ 4
Я думаю, это все равно. В коде нет ничего плохого. В .NET Framework все равно, где будет создан объект. Дело в том, ссылается ли оно на ссылку или нет.
Ответ 5
Да, может быть побочный эффект. Например, если вы используете тот же метод в методе 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);
}
}