Есть ли какие-либо побочные эффекты возврата изнутри инструкции 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);
    }
}