web-dev-qa-db-fra.com

_ => que signifie ce trait de soulignement dans les expressions Lambda?

Qu'est-ce qu'une expression lambda comme _=> expr signifier?

Quel est le but de _ comme entrée pour lambda?

Exemple:

int count = 0;
list.ForEach(_ => count += 1);
103
Prasad

C'est une convention utilisée lorsque vous ne vous souciez pas du paramètre.

76
ChaosPandion

C'est un nom de paramètre, bien qu'il ne soit pas utile, mais c'est celui généralement utilisé (par certaines conventions) lorsque vous devez spécifier que l'expression has un paramètre afin d'obtenir le code à compiler, mais vous ne vous en souciez pas vraiment, vous allez donc simplement l'ignorer.

Il s'agit essentiellement d'exploiter la syntaxe de ce que constitue un identifiant légal en C #, et puisqu'un identifiant peut commencer par un trait de soulignement et ne contenir rien d'autre, c'est juste un nom de paramètre.

Vous auriez pu facilement écrire:

var _ = 10;

_ est un nom de variable valide. Ils utilisent simplement _ en tant que variable.

Parce que l'expression lamda est principalement utilisée dans un code court et anonyme de sorte que le nom de la variable n'est parfois pas nécessaire, même ils n'utilisent pas la variable dans le bloc de code, de sorte qu'ils donnent juste un _ pour une convention courte

9
vodkhang

Je soutiens également l'utilisation de _ => _.method() pour les lambdas d'appel de méthode sur une ligne, car cela réduit le poids cognitif de l'instruction. Particulièrement lors de l'utilisation de génériques, l'écriture de x => x.method() ajoute simplement cette considération en une fraction de seconde de "Qu'est-ce que c'est 'x'? Est-ce une coordonnée dans l'espace?".

Considérez le cas suivant:

Initialize<Client> ( _=>_.Init() );

Utilisé avec un appel Generics, le soulignement dans ce cas fonctionne comme un "symbole de contournement". Il évite la redondance, définissant que le type de l'argument est évident et peut être déduit de l'utilisation - tout comme lorsque vous utilisez 'var' pour éviter de répéter une déclaration de type. L'écriture de client=>client.Init() ici ne ferait que rendre l'instruction plus longue sans lui donner de sens.

Évidemment, cela ne s'applique pas aux paramètres à transmettre à la méthode, qui doit être nommée de manière descriptive. Par exemple: Do( id=>Log(id) );

L'utilisation d'un seul paramètre de soulignement pour les appels de méthode est difficilement justifiable lorsque vous utilisez un bloc de code au lieu d'une ligne unique, car l'identifiant lambda est déconnecté de sa définition générique. En général, lorsque le même identifiant doit être réutilisé, donnez-lui un nom descriptif.

L'essentiel est que la verbosité ne se justifie que pour la désambiguïsation, en particulier pour les lambdas, qui ont été créés pour simplifier la création de délégués anonymes en premier lieu. Dans tous les cas, le bon sens doit être utilisé, équilibrant la lisibilité et la concision. Si le symbole n'est qu'un "crochet" à la fonctionnalité réelle, les identificateurs d'un caractère sont parfaitement bien. C'est le cas des boucles For et des lettres "i" et "j" comme indexeurs.

6
MaDDoX