J'ai lu la version C ++ de cette question mais je ne l'ai pas vraiment comprise.
Quelqu'un peut-il expliquer clairement si cela peut être fait et comment?
J'ai lu la version C ++ de cette question mais je ne l'ai pas vraiment comprise.
Quelqu'un peut-il expliquer clairement si cela peut être fait et comment?
En C # 7 et supérieur, voir cette réponse .
Dans les versions précédentes, vous pouvez utiliser le tuple de .NET 4.0 + :
Par exemple:
public Tuple<int, int> GetMultipleValue()
{
return Tuple.Create(1,2);
}
Les tuples avec deux valeurs ont Item1
et Item2
comme propriétés.
public (int sum, int count) GetMultipleValues() { return (1, 2); }
Cet exemple est tiré de notre exemple de rubrique Documentation à ce sujet .Maintenant que C # 7 est sorti, vous pouvez utiliser la nouvelle syntaxe Tuples incluse
qui pourrait ensuite être utilisé comme ceci:
Vous pouvez également fournir des noms à vos éléments (ils ne sont donc pas "Item1", "Item2", etc.). Vous pouvez le faire en ajoutant un nom à la signature ou aux méthodes de retour:
ou
Ils peuvent également être déconstruits, ce qui est une jolie nouvelle fonctionnalité:
Consultez ce lien pour voir plus d'exemples sur ce qui peut être fait :)
la source
Vous pouvez utiliser trois façons différentes
1. paramètres ref / out
en utilisant ref:
en utilisant:
2. struct / classe
en utilisant struct:
en utilisant la classe:
3. Tuple
Classe de tuple
Tuples C # 7
la source
Vous ne pouvez pas faire cela en C #. Ce que vous pouvez faire, c'est avoir un
Utilisation de notre paramètre Utilisation d'une classe (ou d'une structure) personnaliséeout
paramètre ou retourner votre propre classe (ou struct si vous voulez qu'il soit immuable).la source
async
méthodes.Tuple
est la voie à suivre. (J'utilise cependant desout
paramètres dans des opérations synchrones; ils sont en effet utiles dans ces cas.)Si vous voulez renvoyer plusieurs valeurs, vous pouvez soit renvoyer une classe / structure contenant les valeurs que vous souhaitez renvoyer, soit utiliser le mot clé "out" sur vos paramètres, comme ceci:
la source
L'affiche précédente a raison. Vous ne pouvez pas renvoyer plusieurs valeurs à partir d'une méthode C #. Cependant, vous avez deux options:
Les avantages et les inconvénients ici sont souvent difficiles à comprendre. Si vous retournez une structure, assurez-vous qu'elle est petite car les structures sont de type valeur et passées sur la pile. Si vous retournez une instance d'une classe, vous pouvez utiliser ici certains modèles de conception pour éviter de causer des problèmes - les membres des classes peuvent être modifiés car C # transmet les objets par référence (vous n'avez pas ByVal comme vous le faisiez dans VB ).
Enfin, vous pouvez utiliser des paramètres de sortie, mais je limiterais l'utilisation de cela aux scénarios lorsque vous n'avez que quelques paramètres (comme 3 ou moins) - sinon les choses deviennent laides et difficiles à maintenir. De plus, l'utilisation des paramètres de sortie peut être un frein à l'agilité car la signature de votre méthode devra changer chaque fois que vous aurez besoin d'ajouter quelque chose à la valeur de retour tandis qu'en retournant une structure ou une instance de classe, vous pouvez ajouter des membres sans modifier la signature de la méthode.
D'un point de vue architectural, je déconseille d'utiliser des paires clé-valeur ou des dictionnaires. Je trouve que ce style de codage nécessite des "connaissances secrètes" dans le code qui consomme la méthode. Il doit savoir à l'avance quelles seront les clés et ce que signifient les valeurs et si le développeur travaillant sur l'implémentation interne modifie la façon dont le dictionnaire ou KVP est créé, il pourrait facilement créer une cascade d'échecs dans toute l'application.
la source
Exception
si la deuxième valeur que vous souhaitez renvoyer est disjonctive par rapport à la première: comme lorsque vous souhaitez renvoyer soit une sorte de valeur réussie, soit une sorte de valeur non réussie.Vous renvoyez une instance de classe ou utilisez des paramètres. Voici un exemple de paramètres:
Appelez ça comme ceci:
la source
Il y a plusieurs façons; mais si vous ne voulez pas créer un nouvel objet ou structure ou quelque chose comme ça, vous pouvez faire comme ci-dessous après C # 7.0 :
la source
En C # 7 Il y a une nouvelle
Tuple
syntaxe:Vous pouvez renvoyer cela sous forme d'enregistrement:
Vous pouvez également utiliser la nouvelle syntaxe du déconstructeur:
Soyez prudent avec la sérialisation cependant, tout cela est du sucre syntaxique - dans le code compilé réel, ce sera un
Tuple<string, int>
( selon la réponse acceptée ) avecItem1
etItem2
au lieu defoo
etbar
. Cela signifie que la sérialisation (ou la désérialisation) utilisera ces noms de propriété à la place.Donc, pour la sérialisation, déclarez une classe d'enregistrement et renvoyez-la à la place.
Une autre nouveauté de C # 7 est une syntaxe améliorée pour les
out
paramètres. Vous pouvez désormais déclarer l'out
inline, ce qui est mieux adapté dans certains contextes:Cependant, vous l'utiliserez principalement dans les propres bibliothèques de .NET, plutôt que dans vos propres fonctions.
la source
D'autres réponses ont indiqué l'utilisation de Tuple, que je recommanderais également, mais en utilisant la nouvelle fonctionnalité introduite dans C # 7.0.
De plus amples informations peuvent être trouvées ici .
la source
Il y a plusieurs moyens de le faire. Vous pouvez utiliser des
ref
paramètres:Cela transmet une référence à la fonction permettant ainsi à la fonction de modifier l'objet dans la pile du code appelant. Bien qu'il ne s'agisse pas techniquement d'une valeur "renvoyée", c'est un moyen pour qu'une fonction fasse quelque chose de similaire. Dans le code ci-dessus, la fonction retournerait un
int
et (potentiellement) modifierbar
.Une autre approche similaire consiste à utiliser un
out
paramètre. Unout
paramètre est identique à unref
paramètre avec une règle supplémentaire appliquée par le compilateur. 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 de revenir. Outre cette règle, unout
paramètre fonctionne comme unref
paramètre.L'approche finale (et la meilleure dans la plupart des cas) consiste à créer un type qui encapsule les deux valeurs et permet à la fonction de renvoyer:
Cette approche finale est plus simple et plus facile à lire et à comprendre.
la source
Non, vous ne pouvez pas renvoyer plusieurs valeurs d'une fonction en C # (pour les versions inférieures à C # 7), du moins pas de la façon dont vous pouvez le faire en Python.
Cependant, il existe quelques alternatives:
Vous pouvez renvoyer un tableau d'objet type avec les multiples valeurs que vous souhaitez.
Vous pouvez utiliser des
out
paramètres.la source
En C # 4, vous pourrez utiliser le support intégré pour les tuples pour gérer cela facilement.
En attendant, il y a deux options.
Tout d'abord, vous pouvez utiliser des paramètres ref ou out pour affecter des valeurs à vos paramètres, qui sont retransmises à la routine d'appel.
Cela ressemble à ceci:
Deuxièmement, vous pouvez encapsuler vos valeurs de retour dans une structure ou une classe et les transmettre en tant que membres de cette structure. KeyValuePair fonctionne bien pour 2 - pour plus de 2, vous auriez besoin d'une classe ou d'une structure personnalisée.
la source
vous pouvez essayer ce "KeyValuePair"
Production :
Sortie: 1, 2
la source
Les classes, structures, collections et tableaux peuvent contenir plusieurs valeurs. Les paramètres de sortie et de référence peuvent également être définis dans une fonction. Le retour de plusieurs valeurs est possible dans les langages dynamiques et fonctionnels au moyen de tuples, mais pas en C #.
la source
Il existe principalement deux méthodes. 1. Utilisez les paramètres out / ref 2. Retournez un tableau d'objets
la source
Voici les
Two
méthodes de base :1) Utilisation de '
out
' comme paramètre Vous pouvez également utiliser 'out' pour les versions 4.0 et mineures.Exemple de «sortie»:
Production:
L'aire du rectangle est de 20
Le périmètre du rectangle est de 18
* Remarque: * Le
out
mot-clé décrit les paramètres dont les emplacements variables réels sont copiés sur la pile de la méthode appelée, où ces mêmes emplacements peuvent être réécrits. Cela signifie que la méthode appelante accède au paramètre modifié.2)
Tuple<T>
Exemple de tuple:
Renvoyer plusieurs valeurs DataType à l'aide de
Tuple<T>
Production
REMARQUE: l' utilisation de Tuple est valide à partir de Framework 4.0 et supérieur .
Tuple
le type est aclass
. Il sera alloué dans un emplacement distinct sur le tas géré en mémoire. Une fois que vous avez créé leTuple
, vous ne pouvez pas modifier ses valeursfields
. Cela faitTuple
plus comme unstruct
.la source
Vous pouvez recevoir du code comme
J'espère que ca fonctionne.
la source
Une méthode prenant un délégué peut fournir plusieurs valeurs à l'appelant. Cela emprunte à ma réponse ici et utilise un peu la réponse acceptée par Hadas .
Les appelants fournissent un lambda (ou une fonction nommée) et intellisense aide en copiant les noms de variables du délégué.
la source
Utilisez simplement de la manière OOP une classe comme celle-ci:
Le membre de fonction renvoie le quotient qui intéresse principalement la plupart des appelants. De plus, 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 de nombreuses "valeurs de retour" supplémentaires, très utiles si vous implémentez des appels de base de données ou de réseau, où de nombreux messages d'erreur peuvent être nécessaires, mais uniquement en cas d'erreur.
J'ai également introduit cette solution dans la question C ++ à laquelle OP fait référence.
la source
À partir de cet article, vous pouvez utiliser trois options comme indiqué ci-dessus.
KeyValuePair est le moyen le plus rapide.
out est au deuxième.
Le tuple est le plus lent.
Quoi qu'il en soit, cela dépend de ce qui est le mieux pour votre scénario.
la source
La future version de C # va inclure des tuples nommés. Jetez un œil à cette session channel9 pour la démo https://channel9.msdn.com/Events/Build/2016/B889
Passez à 13h00 pour les tuples. Cela permettra des trucs comme:
(exemple incomplet de la vidéo)
la source
Vous pouvez utiliser un objet dynamique. Je pense qu'il a une meilleure lisibilité que Tuple.
la source
Façons de le faire:
1) KeyValuePair (meilleure performance - 0,32 ns):
2) Tuple - 5,40 ns:
3) out (1,64 ns) ou ref 4) Créez votre propre classe / structure personnalisée
ns -> nanosecondes
Référence: multiple-return-values .
la source
tu peux essayer ça
la source
yield return "value1"; yield return "value2";
as pour ne pas avoir à créer explicitement un nouveaustring[]
?Vous pouvez également utiliser un OperationResult
la source
Une réponse rapide spécialement pour les types de tableaux renvoie:
En utilisant:
la source