Объявление возвращаемых переменных в методах c # против непосредственного возврата значения


17

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

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

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

Благодарность

    private bool Is2(int a)
    {
        return a == 2;
    }

    private bool Is3(int a)
    {
        var result = a == 3;
        return result;
    }

11
Оба примера будут компилироваться в идентичный IL. Единственная причина, по которой вам нужен второй пример, - для целей отладки или если вам нужно использовать его resultперед возвратом.
ChrisF

1
Другая причина может заключаться в том, что вам нужно сделать что-то еще между вычислением результата и его возвратом.
tdammers

1
@ChrisF, на самом деле они не компилируются в один и тот же IL для меня (есть дополнительный stloc.0и ldloc.0во второй версии). Но я думаю, что это происходит только в режиме отладки. И это не очень важно здесь в любом случае.
svick

@svick - ОК - я должен был добавить «в режиме релиза»;)
ChrisF

1
Поскольку вы можете и иногда должны (для краткости) написать что-то похожее: a = b = c;и a == b == cя бы не стал писать что-то похожее, a = b == cесли вы можете. Когда я впервые увидел такую ​​строку кода, мне потребовалось несколько секунд, чтобы понять, что происходит. Этот код выделялся. Я хотел бы поставить круглые скобки a == 3, но StyleCop это не нравится - хорошая причина использовать версию номер один. Что-то еще: это по сути лямбда, например a => (a == 3). Зачем добавлять строку кода в уже раздутую тривиальную функцию?
Работа

Ответы:


7

Поскольку я использую Resharper с Visual Studio, Ctrl-RV (или Ctrl-Alt-V, если вы используете привязки клавиш Resharper / IntelliJ) превращает ваш первый пример во второй. Поэтому, когда я хочу отладить, я могу сделать это достаточно легко. И если я забуду положить его обратно, мне не будет плохо, потому что Ctrl-RI вернет его обратно, чтобы было легче читать.

Серьезно, тратьте свое время на споры о более важных вещах. Например, где поставить ведущие скобки или пробелы против вкладок.


5
Я предпочитаю, чтобы мои дебаты были о невидимых персонажах ...
ChaosPandion

Отличный совет, ребята! Теперь мы можем постоянно пересматривать код друг друга гораздо быстрее, чем раньше. Это, вероятно, сэкономит больше времени, чем на самом деле это обсуждает! :)
pb01

@pdr этот ctrl + RV работает только с resharper? или это какая-то кастомная привязка клавиш? у меня не работает.
Джейн Доу

@JaneDoe: Я ошеломлен, обнаружив, что это рефакторинг Resharper и что VS не имеет эквивалента. Ответ исправлен. Прости за это.
фунтовые

@ChaosPandion U + 200B за победу!
Джесси С. Слайсер

18

Лично я считаю, что первый пример легче читать. Вы все еще можете отладить его, установив точку останова в операторе возврата и добавив a == 2в окно просмотра или используя быстрый просмотр.

Но это действительно вопрос личных предпочтений. Обе версии в порядке.


8
+1 исправление труднее читать код, чтобы упростить расстановку точек останова, делает вещи неправильно вокруг imho
jk.

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

@JustAnotherUserYouMayKnowOrNot: Да. Существует также возможность распечатать сообщение в окне отладки из точки останова. Щелкните правой кнопкой мыши точку останова и выберите «При попадании ...».
Оливье Жако-Дескомб

Также выражение может иметь побочные эффекты, его повторное выполнение может привести к проблемам. Лучше придерживаться результата вар.
JustAnotherUserYouMayKnowOrNot

9

Когда код так же легко читаем как ваш пример, нет ничего плохого в возврате результата логической операции, такой как return a == 2. Однако, если возвращаемое значение является более сложным утверждением или выглядит примерно так

return a > 2? doOptionA().getResult() > makeDecision("greaterThan2") : doOptionB().getResult() == makeDecision("lessThan2");

затем вы захотите использовать переменные для хранения частей этого и упростить оператор return для удобства чтения.


2

В простом примере, подобном этому, любой из них в порядке.

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


Только если есть лучшее имя переменной, чем result, которое само по себе является совершенно неописательным и бесполезным идентификатором.
Александр - Восстановить Монику
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.