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