Оголошення змінних повернення методами c # проти повернення значення безпосередньо


17

У дебатах щодо змінних повернень деякі члени команди віддають перевагу методу повернення результату безпосередньо абоненту, тоді як інші вважають за краще оголосити змінну повернення, яка потім повертається абоненту (див. Приклади коду нижче)

Аргумент останнього полягає в тому, що він дозволяє розробнику, який налагоджує код, знайти повернене значення методу до того, як він повернеться до абонента, тим самим полегшивши розуміння коду: Це особливо актуально, коли виклики методів пов'язані з ромашками.

Чи є якісь вказівки щодо того, який є найефективнішим та / або є якісь інші причини, чому ми повинні прийняти один стиль над іншим?

Спасибі

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

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

11
Обидва приклади будуть складені до ідентичного ІР. Єдина причина, яку ви хочете, щоб другий приклад був в цілях налагодження або якщо вам потрібно скористатися, resultперш ніж повернути його.
ChrisF

1
Інша причина - це тому, що вам потрібно зробити щось інше між обчисленням результату і поверненням.
tdammers

1
@ChrisF, насправді вони не компілюються в той самий ІЛ для мене (є додаткова 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 на виграш!
Джессі К.

20

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

Але це справді питання особистих уподобань. Обидві версії в порядку.


8
+1 прагнути важче читати код, щоб полегшити розміщення точок перерв - це робити не так, як навколо imho
jk.

Вікно годинника або проміжне вікно не завжди є вирішенням цієї проблеми, оскільки іноді вираз вимагає запуску потоку.
JustA AnotherUserYouMayKnowOrNot

@JustAgetherUserYouMayKnowOrNot: Так. Існує також можливість надрукувати повідомлення у вікні налагодження з точки перерви. Клацніть правою кнопкою миші і виберіть пункт "При попаданні ...".
Олів'є Якот-Дескомб

Також вираз може мати побічні ефекти, запуск його знову може призвести до проблем. Краще дотримуйтесь результат вар.
JustA AnotherUserYouMayKnowOrNot

1
Чому налагоджувачі просто не дозволяють вам бачити значення, коли ви наведіть курсор на повернення? Здається, це прямо там, на стопі.
candied_orange

10

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

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

тоді ви хочете використовувати змінні для зберігання фрагментів цього першого та спрощення оператора повернення заради читабельності.


2

У простому прикладі, такому як, будь-який з них ОК.

Для складніших прикладів я віддаю перевагу другому. Це лише тому, що воно читабельніше, а іншим, ймовірно, доведеться підтримувати код.


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