Лучшая практика возврата из использования блоков [дубликаты]

Одна вещь, что я удивлен, что не видел в другом ответе, состоит в том, что 2 метода отладки не взаимоисключающие .

printf отладка может работать вполне приятно даже при использовании стандартного отладчика (ли базирующийся IDE или не). В особенности с платформой журналирования, таким образом, можно оставить все или большую часть в выпущенном продукте для помощи с диагностированием потребительских проблем.

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

8
задан Jon Seigel 4 April 2010 в 04:46
поделиться

7 ответов

Я предпочитаю первый пример. Меньше переменных, меньше строк кода, легче следить, легче поддерживать ...

public int Foo()
{
  using(..)
  {
     return bar;
  }
}
9
ответ дан 3 November 2019 в 14:38
поделиться

Из Оператор using - MSDN

Оператор using гарантирует, что Dispose вызывается, даже если исключение происходит, пока вы вызываете методы на объекте. Вы можете добиться тот же результат, поместив объект внутри блока try, а затем вызов Удалить в блоке finally; на самом деле, вот как оператор using переведено компилятором.

Из try-finally (Справочник по C #)

, наконец, используется, чтобы гарантировать блок операторов кода выполняется независимо от того, как был завершен предыдущий блок try.

Чтобы ответить на ваш вопрос, да, можно вернуться из оператора using.

5
ответ дан 3 November 2019 в 14:38
поделиться

Второй явно лучше, и вы можете убедиться, что он работает нормально, написав тестовую программу.

Оператор using сам по себе не может иметь значения, что является ограничением. Предположим, у вас есть метод с именем Open , который возвращает открытый FileStream , и вы хотите получить длину файла:

Console.WriteLine(Open().Length);

Ошибка в том, что вы не удаляете FileStream . Поэтому вам нужно написать (аналогично вашему примеру):

long length;

using (FileStream file = Open())
    length = file.Length;

Console.WriteLine(length);

Но с помощью простого метода расширения вы можете написать вместо этого:

Console.WriteLine(Open().Use(file => file.Length));

Красиво и аккуратно, и FileStream должным образом утилизируется.

3
ответ дан 3 November 2019 в 14:38
поделиться

Следуя принципу «меньше значит больше» (на самом деле это просто вариант KISS ), первый. Необходимо поддерживать меньше строк кода, нет изменений в семантике и нет потери читабельности (возможно, этот стиль легче читать).

5
ответ дан 3 November 2019 в 14:38
поделиться

Это действительно зависит от личных предпочтений. Вы найдете аргументы по обе стороны этого забора. Лично я предпочитаю вариант 1: вернуться как можно скорее. Я считаю, что он лучше выражает намерение кода; нет причин оставаться здесь дольше, чем нужно. Если вы выполнили всю свою работу, возвращайтесь.

Иногда у вас будет несколько возможных точек возврата и работа «в конце метода» (ведение журнала, cleanup), что может привести к одному оператору возврата. Ничего страшного в этом нет, но вы часто можете справиться с такими ситуациями в блоках finally или с аспектами аспектно-ориентированного программирования.

1
ответ дан 3 November 2019 в 14:38
поделиться

Нет причин не делать этого, поскольку этот оператор using преобразуется в блок try ... finally , а часть finally является гарантированно будет выполнено (даже через возврат или необработанное исключение).

2
ответ дан 3 November 2019 в 14:38
поделиться

Второй мне кажется лучше

public int Foo()
{
  using(..)
  {
     return bar;
  }
}

При использовании этого способа возникает одна вещь: мы возвращаемся в промежутках между использованием, поэтому будет ли объект (который мы обернули с помощью) будет удален, ответ - да поскольку оператор using представляет собой смесь блоков try / finally, можно также вернуться из блока try. return-выражение будет оценено, затем будет выполнен блок finally, и тогда метод вернется. Так что вперед :)

1
ответ дан 3 November 2019 в 14:38
поделиться
Другие вопросы по тегам:

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