Коли доцільно використовувати виражені тілесні члени? [зачинено]


24

C # 6 вводить тілесних членів виразів, які дозволяють спростити код у методах та властивостях, які лише повертають результат виразу:

public override string ToString()
{
     return string.Format("{0} {1}", _field1, _field2);
}

стає:

public override string ToString() =>
    string.Format("{0} {1}", _field1, _field2);

Оскільки зараз у нас є два рівнозначні та дійсні синтаксиси, для вирішення, який використовувати, потрібно використовувати певне правило. Коли нова альтернатива підходить?


7
Гм, коли тіло члена - це вираз?
Йорг W Міттаг

1
Це відповіло б на запитання "коли можна використовувати виражені тілесні члени".
Асик

7
Не повністю пов’язана, але ви не можете використовувати public override string ToString() => $"{_field1} {_field2}";?
Thaoden

3
@JorgWMittag Я до цього додаю "... що не має побічних ефектів". Оголошення методу у функціональному стилі, коли він не є чисто функціональним, було б оманливим.
Жуль

Відповіді:


12

Мови функціонального програмування складаються лише з виразів, тому більшість з них мали подібну функцію з самого початку. Ви використовуєте його, коли у вас є порівняно короткий, часто повторюваний вираз, який можна замінити ще коротшим, набагато більш значущим ім'ям.

Загальним прикладом можуть бути предикати, які використовуються в іншому місці, наприклад:

public static bool isOdd(int num) => (num % 2) == 1;

Якщо вираз занадто довгий, краще розділити його на окремі функції або, можливо, одну функцію з названими проміжними результатами. Якщо він короткий, але ви не можете придумати гарне ім’я, вам краще просто скопіювати вираз, а не створити жахливе ім’я на кшталт condition1чи чогось.


21

Від C # /. NET Маленькі чудеса: Члени висловлювань у C # 6 :

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

(акцент, мій; див. оновлення 1 нижче)

Більше із резюме статті вище:

Отже, C # 6 тепер дає нам можливість визначати властивості get-only та тіла методів із виразами. Це може допомогти зменшити навантаження синтаксису дуже простих методів, щоб зробити ваш код більш стислим.

Однак при всьому використайте судження про те, чи підходить воно для будь-якої ситуації. Коли вираз дуже довгий або складний, використання синтаксису повного тіла може все-таки бути більш читабельним.

І ще одна цитата щодо продуктивності, оскільки проблеми з продуктивністю можуть також виникати, коли доцільно використовувати певну мовну функцію:

Ви можете запитати, чи це має якісь наслідки для продуктивності під час виконання? Власне, відповідь - ні . Це просто синтаксичний цукор, який розширюється в той же ІЛ, що і написання повного тіла. Він не створює делегата, він просто запозичує синтаксис вираження лямбда для спрощення написання простих тіл, які призводять до виразу.

(акцент, автор)

Оновлення 1: @ JörgWMittag сказав

Це не має сенсу. "обмежити це простими виразами та твердженнями"? Так? Це навіть не працює з твердженнями, тільки з виразами!

Здається, у початкового автора може виникнути помилка. Для уточнення, з Нового та вдосконаленого C # 6.0 :

Функції із вираженими функціями - це ще одне спрощення синтаксису в C # 6.0. Це функції, в яких немає тіла оператора. Натомість ви реалізуєте їх із виразом, що слідує за декларацією функції.

Щоб було зрозуміло, це не робить метод чи властивість виразом . Він використовує синтаксис Expression для зменшення рядків коду (та кількості фігурних дужок).

Моя оригінальна рекомендація все ще стоїть: Використовуйте її, коли ваш код стає очевидним і простішим для розуміння, а не просто тому, що ви можете ним користуватися.


2
Це не має сенсу. "обмежити це простими виразами та твердженнями "? Так? Це навіть не працює з твердженнями, тільки з виразами! Я також не впевнений, що додавання безладу (дві дужки та returnключове слово) може коли-небудь призвести до більшої читабельності. Зрештою, складний вираз - це все-таки такий самий складний вираз, щойно закопаний у синтаксичний безлад.
Йорг W Міттаг

3
З того, що я читав, тілесні члени висловлювання - це насправді не вирази. Вони є синтаксичним цукром. Якщо специфікація C # не змінилася після публікації в блозі, вона підтримує методи підтримки з недійсними типами повернення.
Грег Бургхардт

1
Я можу помилятися, але вважаю, що побічні ефекти заборонені у висловлюваннях виразів. Тож для мене користь висловлювань виразів полягає в тому, що ви говорите читачеві, що цей "вираз" чистий і що немає прихованих побічних ефектів, які вам, читачеві, потрібно шукати.
Джон

1
@John "заборонено" абсолютно невірно. Ви можете виконати всі шнанігани, як створити дію, всередині декларації про дії встановити змінні члена, а потім викликати дію. Отже, побічні ефекти, очевидно, не заборонені. Я б точно відказав їм, вони пропускають точку синтаксису вираження.
Мафія

@Mafii. Спасибі. З того часу я дізнався, що ви можете робити "висловлювання висловлювання", яке було описано як "сучасне". Мені, однак, сама ідея просто заплутує.
Джон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.