Quand est-il approprié d'utiliser des membres corporels d'expression? [fermé]


24

C # 6 introduit des membres dotés d'une expression, qui permettent un code simplifié dans les méthodes et les propriétés qui ne renvoient que le résultat d'une expression:

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

devient:

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

Puisque nous avons maintenant deux syntaxes exactement équivalentes et valides, une règle empirique doit être utilisée pour décider laquelle utiliser. Quand la nouvelle alternative est-elle appropriée?


7
Umm, quand le corps du membre est une expression?
Jörg W Mittag

1
Cela répondrait à la question "quand est-il possible d'utiliser des membres corporels d'expression".
Asik

7
Pas complètement lié, mais ne pouvez-vous pas l'utiliser public override string ToString() => $"{_field1} {_field2}";?
Thaoden

3
@JorgWMittag J'ajouterais "... qui n'a pas d'effets secondaires" à cela. Déclarer une méthode dans un style fonctionnel lorsqu'elle n'est pas purement fonctionnelle serait trompeur.
Jules

Réponses:


12

Les langages de programmation fonctionnels se composent uniquement d'expressions, de sorte que la plupart ont eu une fonctionnalité comme celle-ci depuis le début. Vous l'utilisez lorsque vous avez une expression relativement courte, souvent répétée, qui peut être remplacée par un nom encore plus court et beaucoup plus significatif.

Un exemple courant serait les prédicats qui sont utilisés ailleurs, comme:

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

Si l'expression est trop longue, il est préférable de la diviser en fonctions distinctes ou peut-être une fonction avec des résultats intermédiaires nommés. Si c'est court, mais que vous ne pouvez pas penser à un bon nom, vous feriez mieux de simplement copier l'expression plutôt que de créer un nom terrible comme condition1ou quelque chose.


21

De C # /. NET Little Wonders: membres d'expression en C # 6 :

Alors, devriez-vous utiliser cela? Tout se résume au style. Mon instinct serait de limiter cela à des expressions et des déclarations simples qui peuvent être clairement comprises à première vue.

(c'est moi qui souligne; voir la mise à jour 1 ci-dessous)

Plus du résumé de l'article ci-dessus:

Donc C # 6 nous donne maintenant la possibilité de spécifier des corps de méthode et de propriété get-only avec des expressions. Cela peut aider à réduire la charge de syntaxe des méthodes très simples pour rendre votre code plus concis.

Cependant, avec toutes choses, utilisez votre jugement pour savoir si cela convient à une situation donnée. Lorsqu'une expression est très longue ou complexe, l'utilisation de la syntaxe du corps entier peut toujours être plus lisible.

Et une autre citation sur les performances, car les problèmes de performances peuvent également jouer lorsqu'il est approprié d'utiliser une certaine fonctionnalité de langue:

Maintenant, vous pouvez vous demander si cela a des implications sur les performances lors de l'exécution? En fait, la réponse est non . Il s'agit simplement de sucre syntaxique qui se développe dans le même IL que l'écriture du corps entier. Il ne crée pas de délégué, il emprunte simplement la syntaxe d'expression lambda pour simplifier l'écriture de corps simples qui aboutissent à une expression.

(italique, l'auteur)

Mise à jour 1: @ JörgWMittag a déclaré

Cela n'a aucun sens. "limiter cela à de simples expressions et déclarations"? Hein? Cela ne fonctionne même pas avec les instructions, uniquement avec les expressions!

Il semble que l'auteur d'origine ait mal parlé. Pour clarifier, à partir du nouveau et amélioré C # 6.0 :

Les fonctions à corps d'expression sont une autre simplification de la syntaxe dans C # 6.0. Ce sont des fonctions sans corps d'instruction. Au lieu de cela, vous les implémentez avec une expression suivant la déclaration de fonction.

Pour être clair, cela ne fait pas d'une méthode ou d'une propriété une expression . Il utilise la syntaxe d' expression pour réduire les lignes de code (et le nombre d'accolades).

Ma recommandation d'origine est toujours valable: utilisez-la lorsqu'elle rend votre code évident et plus facile à comprendre, et pas simplement parce que vous pouvez l'utiliser.


2
Cela n'a aucun sens. "limiter cela à de simples expressions et déclarations "? Hein? Cela ne fonctionne même pas avec les instructions, uniquement avec les expressions! Je ne suis pas non plus convaincu que l' ajout d' encombrement (deux parenthèses et un returnmot - clé) puisse jamais conduire à plus de lisibilité. Après tout, l'expression complexe est toujours exactement la même expression complexe, juste enterrée dans un encombrement syntaxique.
Jörg W Mittag du

3
D'après ce que j'ai lu, les membres corporels d'expression ne sont pas réellement des expressions. Ce sont des sucres syntaxiques. Sauf si la spécification C # a changé depuis le billet de blog, elle prend en charge les méthodes avec des types de retour vides.
Greg Burghardt

1
Je peux me tromper, mais je crois que les effets secondaires sont interdits dans les déclarations d'expression. Donc pour moi, l'avantage des déclarations d'expression est que vous dites au lecteur que cette "expression" est pure et qu'il n'y a pas d'effets secondaires cachés que vous, le lecteur, devez rechercher.
John

1
@John "disallowed" est complètement faux. Vous pouvez faire tous les manigances comme créer une action, à l'intérieur des variables membres du jeu de déclarations d'actions, puis invoquer l'action. Par conséquent, les effets secondaires ne sont évidemment pas interdits. Je les découragerais certainement, ils manquent le point de la syntaxe d'expression.
Mafii

@Mafii. Merci. J'ai appris depuis que vous pouvez faire des "déclarations d'expression", qui ont été décrites comme étant "modernes". Pour moi, cependant, l'idée même prête à confusion.
John
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.