Есть ли какие-либо побочные эффекты возврата из использования () оператор?

Возврат метода оценивает из оператора использования, который добирается, 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;
    }
}

Но я всегда чувствую, что должен закрывать что-то, прежде чем я убегу из скобок использования, например, путем определения транзакции перед оператором использования, доберусь, это - значение в скобках, и затем возвращающийся после скобок.

Был бы, определяя и возвращая переменную вне скобок использования быть лучшей практикой или сохранить ресурсы всегда?

124
задан Edward Tanguay 3 March 2010 в 09:06
поделиться

4 ответа

Нет, я думаю, так понятнее. Не волнуйтесь, 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);
    }
}
160
ответ дан 24 November 2019 в 01:08
поделиться

Взгляните на это

Понимание оператора using в C #

CLR преобразует ваш код в MSIL. И оператор using получает {{1 }} переведено в блок попытки и наконец . Вот как оператор using представлен в IL. Оператор using переводится на три части : получение, использование и удаление. Ресурс сначала приобретается, затем использование включается в оператор try с предложением finally . Затем объект удаляется в предложении finally.

31
ответ дан 24 November 2019 в 01:08
поделиться

Нет никаких побочных эффектов возврата изнутри оператора using().

Получается ли при этом наиболее читабельный код - это другой вопрос.

6
ответ дан 24 November 2019 в 01:08
поделиться

Я думаю, что это все равно. В коде нет ничего плохого. Фреймворку .NET все равно, где создается объект. Важно то, ссылается он или нет.

0
ответ дан 24 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: