Ils ont tous leurs avantages et leurs inconvénients.
Les paramètres externes sont rapides et bon marché, mais ils nécessitent de passer une variable et reposent sur la mutation. Il est presque impossible d'utiliser correctement un paramètre out avec LINQ.
Les tuples créent une pression de collecte 1 et ne sont pas auto-documentées. "Item1" n'est pas très descriptif.
Les structures personnalisées peuvent être lentes à copier si elles sont grandes, mais elles s'auto-documentent et sont efficaces si elles sont petites. Cependant, il est également pénible de définir un grand nombre de structures personnalisées pour des utilisations triviales.
Je pencherais pour la solution de la structure personnalisée, toutes choses égales par ailleurs. Mais ce qui est encore mieux, c'est de créer une fonction qui ne renvoie qu'une seule valeur . Pourquoi retournez-vous deux valeurs en premier lieu ?
Notez que les tuples dans C# 7, qui a été livré six ans après la rédaction de cette réponse, sont des types de valeur et donc moins susceptibles de créer une pression de collection.
1 Chaque fois que vous allouez un petit objet du tas, cela exerce une "pression" sur le collecteur d'ordures. Plus la pression est forte, plus les collectes sont fréquentes. Dans certaines applications, il est important de contrôler la pression exercée par le ramasseur d'ordures. Ainsi, allouer quelques millions de tuples inutilement peut être une mauvaise chose dans ces applications. Bien sûr, comme pour toutes les questions de performance, ne faites pas de changements aveugles avant d'avoir compris l'ampleur du problème.
0 votes
String n'est pas un type de valeur. Je pense que vous vouliez dire "considérer une fonction qui renvoie deux valeurs".
0 votes
@Eric : Vous avez raison. Je voulais dire des types immuables.
0 votes
Et quel est le problème avec une classe ?
1 votes
@lukas : Rien, mais ce n'est sûrement pas dans les meilleures pratiques. Il s'agit d'une valeur légère (< 16 KB) et si je dois ajouter un code personnalisé, j'opterai pour
struct
comoEric
mentionnés.0 votes
C'est un peu plus compliqué, mais dans votre cas, je pense que KeyValuePair serait un meilleur choix que Tuple.
1 votes
Je dirais que vous ne devez utiliser out que lorsque vous avez besoin de la valeur de retour pour décider si vous devez traiter les données de retour, comme dans TryParse, sinon vous devez toujours retourner un objet structuré, quant à savoir si l'objet structuré doit être de type valeur ou de type référence, cela dépend de l'utilisation supplémentaire que vous faites des données.
0 votes
@Lukas, Tuple est une classe