523 votes

Comment puis-je retourner plusieurs valeurs d'une fonction en C #?

J'ai lu la version C ++ de cette question mais je ne l'ai pas vraiment comprise.

Quelqu'un peut-il s'il vous plaît expliquer clairement si cela peut être fait et comment?

692voto

Hadas Points 2448

Utilisez le Tuple de .NET 4.0 + :

Par exemple:

 public Tuple<int, int> GetMultipleValue()
{
     return Tuple.Create(1,2);
}
 

75voto

Samuel Points 21085

Vous ne pouvez pas le faire en C #. Ce que vous pouvez faire est d’avoir un paramètre out ou de renvoyer votre propre classe (ou struct si vous voulez qu’elle soit immuable).

Utilisation du paramètre out

 public int GetDay(DateTime date, out string name)
{
  // ...
}
 

Utiliser une classe personnalisée (ou struct)

 public DayOfWeek GetDay(DateTime date)
{
  // ...
}

public class DayOfWeek
{
  public int Day { get; set; }
  public string Name { get; set; }
}
 

39voto

Chris Doggett Points 9987

Si vous voulez dire retourner plusieurs valeurs, vous pouvez retourner un class/struct contenant les valeurs que vous souhaitez retourner, ou utilisez le mot clé « out » sur vos paramètres, comme suit :

33voto

Kevin Hoffman Points 2279

Affiche précédente est droit. Vous ne pouvez pas retourner plusieurs valeurs à partir d'une méthode C#. Toutefois, vous avez deux options:

  • De retour d'une structure qui contient plusieurs membres
  • Retourner une instance d'une classe
  • Utiliser les paramètres de sortie (à l'aide de la sortie ou ref mots-clés)
  • L'utilisation d'un dictionnaire ou d'une paire clé-valeur en sortie

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.

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.

22voto

Keltex Points 17151

Vous retourner soit une instance de la classe notre utilisation des paramètres out . Voici un exemple de paramètres :

Appelez-le comme ceci :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X