Kiedy należy używać wyrazistych członków? [Zamknięte]

24

C # 6 wprowadza elementy wyrażające, które pozwalają na uproszczony kod w metodach i właściwościach, które zwracają tylko wynik wyrażenia:

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

staje się:

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

Ponieważ mamy teraz dwie dokładnie równoważne i poprawne składnie, należy zastosować pewną ogólną regułę, aby zdecydować, którego użyć. Kiedy nowa alternatywa jest odpowiednia?

Asik
źródło
7
Umm, kiedy ciało członka jest wyrażeniem?
Jörg W Mittag
1
Odpowiadałoby to na pytanie „kiedy można używać wyrazistych członków”.
Asik
7
Nie do końca powiązane, ale nie możesz użyć public override string ToString() => $"{_field1} {_field2}";?
Thaoden
3
@JorgWMittag Dodałbym do tego „... to nie ma skutków ubocznych”. Deklarowanie metody w funkcjonalnym stylu, gdy nie jest ona czysto funkcjonalna, może wprowadzać w błąd.
Jules,

Odpowiedzi:

12

Funkcjonalne języki programowania składają się tylko z wyrażeń, więc większość z nich miała taką funkcję od samego początku. Używasz go, gdy masz stosunkowo krótkie, często powtarzane wyrażenie, które można zastąpić jeszcze krótszą, o wiele bardziej znaczącą nazwą.

Typowym przykładem są predykaty, które są używane gdzie indziej, takie jak:

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

Jeśli wyrażenie jest zbyt długie, lepiej podzielić je na osobne funkcje lub jedną funkcję z nazwanymi wynikami pośrednimi. Jeśli jest krótki, ale nie możesz wymyślić dobrego imienia, lepiej po prostu skopiuj wyrażenie, niż stwórz okropne imię condition1lub coś w tym stylu.

Karl Bielefeldt
źródło
21

Od C # /. NET Little Wonders: Członkowie wyrażeniowo w C # 6 :

Więc powinieneś tego użyć? Wszystko sprowadza się do stylu. Moim celem byłoby ograniczenie tego do prostych wyrażeń i stwierdzeń, które można zrozumieć na pierwszy rzut oka.

(podkreślenie, moje; patrz aktualizacja 1 poniżej)

Więcej z podsumowania powyższego artykułu:

Więc C # 6 daje nam teraz możliwość określania właściwości tylko get i metod metod za pomocą wyrażeń. Pomoże to zmniejszyć obciążenie bardzo prostymi składniami, aby kod był bardziej zwięzły.

Jednak we wszystkich kwestiach należy ocenić, czy pasuje to do danej sytuacji. Gdy wyrażenie jest bardzo długie lub złożone, użycie pełnej składni może być jeszcze bardziej czytelne.

I kolejny cytat na temat wydajności, ponieważ problemy z wydajnością mogą również odgrywać rolę, gdy właściwe jest użycie określonej funkcji języka:

Teraz możesz zapytać, czy ma to wpływ na wydajność w czasie wykonywania? Właściwie odpowiedź brzmi nie . Jest to po prostu cukier składniowy, który rozwija się w tę samą IL, co pisanie całego ciała. To nie nie stworzyć delegata, to jest po prostu zapożyczając wyrażenie składni lambda uproszczenia pisania prostych ciał, które prowadzą w wyrażeniu.

(wyróżnienie, autor)

Aktualizacja 1: @ JörgWMittag powiedział

To nie ma sensu. „ograniczyć to do prostych wyrażeń i stwierdzeń”? Co? Nie działa nawet z instrukcjami, tylko z wyrażeniami!

Wygląda na to, że oryginalny autor mógł się pomylić. Aby to wyjaśnić, z nowego i ulepszonego C # 6.0 :

Funkcje treści wyrażeń są kolejnym uproszczeniem składni w C # 6.0. Są to funkcje bez treści instrukcji. Zamiast tego implementujesz je za pomocą wyrażenia następującego po deklaracji funkcji.

Dla jasności nie oznacza to, że metoda lub właściwość są wyrażeniem . Wykorzystuje składnię wyrażeń do zmniejszenia linii kodu (i liczby nawiasów klamrowych).

Moja oryginalna rekomendacja nadal obowiązuje: używaj jej, gdy uczyni twój kod oczywistym i łatwiejszym do zrozumienia, nie tylko dlatego, że możesz go użyć.

Greg Burghardt
źródło
2
To nie ma sensu. „ograniczyć to do prostych wyrażeń i stwierdzeń ”? Co? Nie działa nawet z instrukcjami, tylko z wyrażeniami! Nie jestem również przekonany, że dodanie bałaganu (dwa nawiasy i returnsłowo kluczowe) może kiedykolwiek prowadzić do większej czytelności. W końcu złożone wyrażenie jest wciąż dokładnie tym samym złożonym wyrażeniem, po prostu zakopane w bałaganie syntaktyczne.
Jörg W Mittag
3
Z tego, co przeczytałem, wyraziste ciała nie są w rzeczywistości wyrażeniami. Są cukrem syntaktycznym. O ile specyfikacja C # nie zmieniła się od czasu postu na blogu, obsługuje metody z nieważnymi typami zwrotów.
Greg Burghardt
1
Mogę się mylić, ale wierzę, że skutki uboczne są niedozwolone w Wyrażeniach Wyrażeniowych. Tak więc dla mnie zaletą wyrażeń jest to, że mówisz czytelnikowi, że to „wyrażenie” jest czyste i że nie ma żadnych ukrytych skutków ubocznych, których ty, czytelnik, musisz szukać.
John
1
@John „niedozwolony” jest całkowicie błędny. Możesz wykonać wszystkie shenanigany, takie jak tworzenie akcji, w deklaracji akcji ustaw zmienne składowe członka, a następnie wywołaj akcję. Dlatego efekty uboczne nie są oczywiście niedozwolone. Zdecydowanie bym ich zniechęcił, brakuje im sensu składni wyrażenia.
Mafii
@Mafii. Dzięki. Od tego czasu nauczyłem się, że możesz robić „wyrażenia wyrażające”, które opisano jako „nowoczesne”. Dla mnie jednak sam pomysł jest po prostu mylący.
John