0
votes

Est-il nécessaire d'utiliser () avec la méthode Contient?

J'ai un code à ressembler à ceci:

string target = ListOfTabs.FirstOrDefault(e.Target.Location.OriginalString.Contains);


2 commentaires

contient est une fonction, contient (..) est un appel à la fonction.


Question associée .


3 Réponses :


1
votes

Vous n'en avez pas besoin parce que firstordfault code> Prenez un Func code> dans le paramètre. Étant donné que contient code> correspond au type demandé, vous pouvez passer contient code> comme vous passeriez tout argument à une autre fonction.

La signature de FirstArdefault est la suivante: P>

var target = ListOfTabs.FirstOrDefault(e.Target.Location.OriginalString.Contains);


0 commentaires

0
votes

firstordfault Accepte un Func comme son argument.

Normalement, ce serait une expression lambda, mais comme string.contains peut être distribué sur un Func , il peut être transmis directement à la méthode directement. (en supposant que listoftabs est ienumerable ).

Dans la mise en œuvre de FirstOrdefault , la syntaxe () sera utilisée pour exécuter string.contains . .


0 commentaires

5
votes

FirstArdefault prend essentiellement une fonction comme argument. L'écriture xxx

est pratiquement la même chose que l'écriture xxx

contient et x => contient (x) sont des fonctions, de sorte que cela fonctionne!


9 commentaires

En outre, même si la deuxième ligne de code est plus lisible et facile à comprendre, il a un coût car il crée de nouveaux objets.


@Orace Pas vrai


@ Canton7 Le lien que vous avez fourni affiche le compilateur de Lambda-version définit inutilement un nouveau [compilergénerated] méthode b__1_0 (chaîne) - tandis que cette won ' t résultat dans des allocations de tas de GC (et le JIT fera probablement en ligne la fonction), il est décevant que le compilateur C # n'entraîne pas automatiquement des lambdas triviaux.


@ORACE Cette question se compare à la création d'un délégué vs en ne la créant pas, et le délégué capture. Aucun des délégués dans la question ci-dessus ne capture


@Dai ouais j'ai trouvé cet étrange - je suis déjà Demandé à ce sujet sur Gitter . Je suppose que ce serait une optimisation inutile. Il est également inhabituel que le compilateur ne met pas en cache le délégué généré: normalement, il fait


@ Canton7 dans certains cas, il y a une capture de contexte: sharplab.io/... < / a>


@Orace correct, mais pas dans cette réponse, et certainement pas dans "la deuxième ligne de code", comme vous le prétendiez


@ Canton7 Nous ne savons pas où E est déclaré, est-ce dans le contexte local ou est-ce un champ d'objet actuel? Par convention de cas, il s'agit probablement d'un paramètre de la méthode actuelle et appartient au contexte local et doit être capturé.


@Orace c'est juste. Votre commentaire original pourrait faire avec quelques éclaircissements, puis