2010-11-27 3 views
2

Ceci est pour une méthode mathématique qui prend en entrée 3 doubles (a, b, c).Retour de 2 valeurs d'une méthode

Ensuite, ces 3 valeurs sont calculées dans une formule (formule abc pour les racines carrées).

La formule a 2 valeurs qui doivent être retournées mais comment faire exactement cela?

Je pensais à un tableau/objets, mais je ne sais pas comment les initialiser à cette fin. Les paramètres de sortie ne sont vraiment pas utiles dans cette situation, n'est-ce pas?

Cordialement.

+0

Paramètres de sortie sont exactement pour vous ici ... tout le reste est un surpuissant (Tuples et tableaux, par exemple) –

+1

... mais les Tuples (ou même les paires personnalisées) sont la façon C# d'aller. – SWeko

Répondre

3

En C# 4 (disponible dans Visual Studio 2010):

Tuple<double, double> Foo(double a, double b, double c) 
{ 
    ... 
    return Tuple.Create(firstReturnValue, secondReturnValue); 
} 

Si vous travaillez avec une version antérieure de C#, vous pouvez définir votre propre implémentation d'un deux-tuple (paire) comme suit:

public struct Tuple<A, B> 
{ 
    public readonly A Item1; 
    public readonly B Item2; 
    public Tuple(A a, B b) { Item1 = a; Item2 = b; } 
} 
public static class Tuple 
{ 
    public static Tuple<A,B> Create<A,B>(A a, B b) { return new Tuple<A,B>(a,b); } 
} 

Bien sûr, Tuple est un type de données très générales et non spécifiques. Vous pourriez tout aussi bien implémenter un type de retour composite (similaire à ce que je viens de montrer, mais plus simple) qui est plus spécifique à votre situation.

1

En C# 4, vous pouvez le faire même que Tuple comme décrit par Staks ci-dessus

mais au-dessous C# 4, vous pouvez retourner une liste qui contient autant que les valeurs que vous souhaitez revenir.

0

Un tableau n'est pas très favorable, car vous avez juste un tas d'éléments, sans plus d'informations à leur sujet, vraiment. L'appelant doit en quelque sorte «savoir» quel élément non. 0, élément no. 1 est.

Dans un tel cas, je voterais toujours pour utiliser une classe - définissez un type de retour en tant que classe, donnez aux champs individuels des noms significatifs. Une classe vous donne la possibilité de découvrir (par noms de champs), la possibilité de mélanger les types de retour (retour INT, deux DECIMAL, une chaîne), et il encapsule bien vos résultats:

public class ResultType 
{ 
    decimal Value { get; set; } 
    decimal AnotherValue { get; set; } 
    int StatusCode { get; set; } 
    string Message { get; set; } 
} 

puis définissez votre méthode comme :

ResultType YourMethodName(double a, double b, double c) 
{ 
    ResultType result = new ResultType(); 

    // do your calculations here...... 
    result.Value = ......... 
    result.AnotherValue = ............ 
    result.StatusCode = 0; 
    result.Message = "everything OK"; 

    return result; 
} 
+0

Ok merci pour l'information jamais vu comme ça avant. Mais comment exactement lier ces propriétés de la classe ResultType avec ma méthode où les calculs ont lieu?Cordialement. – Tonz

+0

Je ne vois aucune raison de rendre cette classe mutable. Il n'a pas d'identité en dehors des valeurs qu'il contient. – CodesInChaos

+0

@Tonz: mise à jour de ma réponse à afficher: instanciez simplement une instance de la classe, définissez les propriétés sur les valeurs de votre choix et renvoyez cette instance à –

0

Je créerais une classe dans le but, de même un simple struct, mais un tuple (comme stakx suggéré) est tout aussi bien, et même une liste ou une collection peut faire l'affaire.

+0

+1 pour struct, car cela sauverait le GC qu'une classe ou un tableau provoquerait –