Renvoyer plusieurs valeurs à une méthode de l'appelant
J'ai lu le Version C++ de cette question mais n'a pas vraiment le comprendre.
Quelqu'un peut-il expliquer clairement si cela peut être fait et comment?
Vous devez vous connecter pour publier un commentaire.
Utilisation .NET 4.0+s'Tuple:
Par Exemple:
Les Tuples avec les deux valeurs ont
Item1
etItem2
en tant que propriétés.public (int sum, int count) GetMultipleValues() { return (1, 2); }
Cet exemple est tiré de notre rubrique Documentation exemple sur ce.Maintenant que C# 7 a été libéré, vous pouvez utiliser le nouveau inclus les Tuples de la syntaxe
qui pourrait ensuite être utilisée comme ceci:
Vous pouvez également fournir les noms de vos éléments (de sorte qu'ils ne sont pas "Élément1", "Item2", etc). Vous pouvez le faire en ajoutant un nom pour la signature ou le retour à des méthodes:
ou
Ils peuvent également être déconstruit, ce qui est une très bonne nouvelle fonctionnalité:
Découvrez ce lien voir plus d'exemples sur ce qui peut être fait 🙂
Vous pouvez utiliser de trois façons différentes
1. ref /paramètres
à l'aide de ref:
à l'aide de sortie:
2. struct /classe
à l'aide struct:
l'aide de la classe:
3. Tuple
Tuple de la classe
C# 7 Tuples
Vous ne pouvez pas le faire en C#. Ce que vous pouvez faire est d'avoir un
out
paramètre ou de retour de votre propre classe (ou structure si vous voulez qu'il soit immuable).À l'aide de paramètre de sortie
L'aide personnalisé de la classe (ou structure)
async
méthodes.Tuple
est le chemin à parcourir. (J'utiliseout
paramètres dans des opérations synchrones: ils sont en effet très utile dans ces cas.)Si tu veux retourner plusieurs valeurs, vous pouvez soit retourner un class/struct contenant les valeurs que vous voulez retourner, ou utilisez le "de" de mots-clés dans vos paramètres, comme:
Affiche précédente est droit. Vous ne pouvez pas retourner plusieurs valeurs à partir d'une méthode C#. Toutefois, vous avez deux options:
Les avantages et les inconvénients sont souvent difficiles à comprendre. Si vous retournez une structure, assurez-vous qu'il est petit parce que les structures sont de type de valeur et passés sur la pile. Si vous retournez une instance d'une classe, il y a quelques modèles de conception ici que vous pouvez utiliser pour éviter de causer des problèmes - les membres des classes peuvent être modifiés, car C# passe les objets par référence (vous n'avez pas ByVal comme vous l'avez fait en VB).
Enfin, vous pouvez utiliser les paramètres de sortie, mais je voudrais limiter l'utilisation de cette scénarios lorsque vous avez seulement un couple (comme 3 ou moins) de paramètres - sinon, les choses se corsent et difficiles à maintenir. Aussi, l'utilisation de paramètres de sortie peut être un inhibiteur de l'agilité, car votre signature de la méthode devra changer à chaque fois que vous avez besoin d'ajouter quelque chose à la valeur de retour alors que de retourner une structure ou instance de classe, vous pouvez ajouter des membres, sans modifier la signature de la méthode.
À partir d'un point de vue architectural, je déconseille l'utilisation de paires clé-valeur, ou les dictionnaires. Je trouve ce style de codage nécessite "connaissance secrète" dans le code qui utilise la méthode. Il doit savoir à l'avance ce que les touches sont va être et ce que les valeurs de la moyenne et si le développeur qui travaille sur la mise en œuvre interne de change la façon dont le dictionnaire ou KVP est créé, il peut facilement créer une défaillance en cascade tout au long de l'ensemble de l'application.
Exception
si la deuxième valeur que vous voulez revenir est disjonctif de la première: comme lorsque vous voulez retourner un genre de succès de la valeur, ou une sorte d'échec de la valeur.Vous renvoyer une instance de classe ou de l'utilisation hors paramètres. Voici un exemple de paramètres:
L'appeler comme ceci:
Il y a plusieurs façons de le faire. Vous pouvez utiliser
ref
paramètres:Ce passe une référence à la fonction, permettant ainsi à la fonction de modifier l'objet dans le code d'appel de la pile. Alors que ce n'est pas techniquement un "retour" de la valeur, il est un moyen d'avoir une fonction de faire quelque chose de similaire. Dans le code ci-dessus, la fonction retourne un
int
et (éventuellement) de modifierbar
.Une autre approche consiste à utiliser un
out
paramètre. Unout
paramètre est identique à unref
paramètre avec un autre compilateur règle imposée. Cette règle est que si vous passez unout
paramètre dans une fonction, cette fonction est nécessaire pour définir sa valeur avant le retour. En plus de cette règle,out
paramètre fonctionne comme unref
paramètre.De l'approche finale (et le meilleur dans la plupart des cas) est de créer un type qui englobe à la fois des valeurs et de permettre à la fonction de retour:
Cette dernière approche est plus simple et plus facile à lire et à comprendre.
Non, vous ne pouvez pas retourner plusieurs valeurs à partir d'une fonction en C# (pour les versions inférieures à C# 7), au moins pas de la façon dont vous pouvez le faire en Python.
Cependant, il ya un couple de solutions de rechange:
Vous pouvez retourner un tableau de type object avec les multiples valeurs que vous voulez dedans.
Vous pouvez utiliser
out
paramètres.En C# 4, vous serez en mesure d'utiliser un support intégré pour les n-uplets de gérer facilement.
Dans l'intervalle, il ya deux options.
Tout d'abord, vous pouvez utiliser la ref ou des paramètres de sortie pour attribuer des valeurs à ces paramètres, qui sont passés de retour à l'appel de la routine.
Cela ressemble à:
Seconde, vous pouvez envelopper vos valeurs de retour dans une structure ou une classe, et de les transmettre à l'arrière comme les membres de cette structure. KeyValuePair fonctionne bien pour les 2 - pour plus de 2, vous auriez besoin d'une classe personnalisée ou struct.
En C#7, Il y a un nouveau
Tuple
syntaxe:Vous pouvez revenir à ce que l'enregistrement:
Vous pouvez également utiliser la nouvelle déconstructeur syntaxe:
Être prudent avec la sérialisation cependant, tout cela est syntaxique de sucre dans le code compilé, ce sera un
Tupel<string, int>
(comme par le a accepté de répondre à) avecItem1
etItem2
au lieu defoo
etbar
. Cela signifie que la sérialisation (ou deserialisation) pour utiliser ces noms de propriété plutôt.Donc, pour la sérialisation de déclarer une classe d'enregistrement et de retour à la place.
Aussi de nouvelles en C#7 est une amélioration de la syntaxe pour
out
paramètres. Vous pouvez maintenant déclarer lesout
inline, ce qui est mieux adapté dans certains contextes:Cependant, la plupart du temps vous allez l'utiliser dans .NET propres bibliothèques, plutôt que dans ses propres fonctions.
vous pouvez essayer ce "KeyValuePair"
De sortie :
De sortie : 1, 2
D'autres réponses a déclaré à l'aide de n-uplet, que je recommande aussi, mais à l'aide de la nouvelle fonctionnalité introduite dans C# 7.0.
De plus amples informations peuvent être trouvées ici.
Classes, Structures, les Collections et les Tableaux peuvent contenir plusieurs valeurs. De sortie et des paramètres de référence peut également être définie dans une fonction. Renvoyer plusieurs valeurs est possible en dynamique et fonctionnelle des langues par le biais de tuples, mais pas en C#.
Principalement deux méthodes sont là.
1. Utiliser/ref paramètres
2. Retourne un Tableau d'objets
Ici sont à la base
Two
méthodes:1) l'Utilisation de "
out
" comme paramètreVous pouvez utiliser 'out' pour les deux 4.0 et versions mineures trop.
Exemple de "out":
De sortie:
Aire du Rectangle est de 20
Périmètre du Rectangle est de 18
*Remarque:*La
out
mot-clé décrit les paramètres dont la variable réelle emplacements sont copiés sur la pile de la méthode appelée, où ces mêmes endroits peut être réécrite. Cela signifie que l'appel de la méthode d'accès au paramètre modifié.2)
Tuple<T>
Exemple de Tuple:
Renvoi de Plusieurs Type de données valeurs à l'aide
Tuple<T>
Sortie
REMARQUE: Utilisation de n-uplet est valable à partir du Framework 4.0 et au-dessus de.
Tuple
le type est unclass
. Il sera attribué à un autre endroit sur le tas managé dans la mémoire. Une fois que vous créez leTuple
, vous ne pouvez pas modifier les valeurs de sesfields
. Cela rend leTuple
plus comme unstruct
.Une méthode de prendre un délégué peut fournir plusieurs valeurs à l'appelant. Cette emprunte de ma réponse ici et utilise un peu de Hadas a accepté de répondre à.
Appelants fournir un lambda (ou un nom de fonction) et intellisense permet en copiant les noms de variables du délégué.
Simplement utiliser en programmation orientée objet, une classe comme ceci:
La fonction de membre renvoie le quotient de laquelle la plupart des interlocuteurs sont d'abord intéressés à la. En outre, il stocke le reste en tant que membre de données, qui est facilement accessible par l'appelant par la suite.
De cette façon, vous pouvez avoir beaucoup d'autres "valeurs de retour", très utile si vous mettez en œuvre la base de données ou d'un réseau d'appels, où beaucoup de messages d'erreur peuvent être nécessaires, mais seulement dans le cas où une erreur se produit.
Je suis entré dans cette solution aussi dans le C++ question que l'OP se réfère.
De cette article, vous pouvez utiliser trois options que les messages ci-dessus dit.
KeyValuePair est le moyen le plus rapide.
hors est à la seconde.
Tuple est le plus lent.
De toute façon, c'est dépendent de ce qui est le meilleur pour votre scénario.
Future version de C# va inclure nommé n-uplets.
Jetez un oeil à ce channel 9 session pour la démo
https://channel9.msdn.com/Events/Build/2016/B889
Passez à 13:00 pour le n-uplet des trucs. Cela permettra à des trucs comme:
(exemple incomplète de la vidéo)
Vous pouvez utiliser un objet dynamique. Je pense qu'il a une meilleure lisibilité de Tuple.
Vous pouvez recevoir un code comme
J'espère que cela fonctionne.
Façons de le faire:
1) KeyValuePair (Meilleure Performance - 0.32 ns):
2) n-uplet - 5.40 ns:
3) out (1.64 ns) ou ref
4) Créer votre propre personnalisé class/struct
ns -> nanosecondes
Référence: plusieurs retour des valeurs.
vous pouvez essayer ce
yield return "value1"; yield return "value2";
de ne pas avoir à créer explicitement un nouveaustring[]
?Vous pouvez également utiliser un OperationResult
Aujourd'hui, les programmeurs ont besoin de temps & unforgotable méthodes.
Une toute simple, et rapide solution:
De l'utiliser quelque part;