2010-11-27 22 views
2

Dies ist für eine mathematische Methode, die 3 Doppel als Eingabe (a, b, c) akzeptiert.Rückgabe von 2 Werten aus einer Methode

Als nächstes werden diese 3 Werte in einer Formel berechnet (abc Formel für Quadratwurzeln).

Die Formel hat 2 Werte, die zurückgegeben werden müssen, aber wie genau mache ich das?

Ich dachte an ein Array/Objekte, aber nicht sicher, wie Sie sie für diesen Zweck initialisieren. Out-Parameter sind in dieser Situation nicht wirklich von Nutzen, oder?

Grüße.

+0

Ausgabeparameter sind genau für Sie hier ... alles andere ein großer ist übertrieben (Tupeln und Arrays zum Beispiel) –

+1

... aber Tupel (oder sogar benutzerdefinierte Paare) sind der C# Weg zu gehen. – SWeko

Antwort

3

In C# 4 (verfügbar in Visual Studio 2010):

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

Wenn Sie mit einer früheren Sprachversion von C# arbeiten, können Sie Ihre eigene Implementierung einer Zwei-Tupel definieren (pair) wie folgt:

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); } 
} 

natürlich Tuple ist ein sehr allgemeiner und unspezifische Datentyp. Sie könnten auch einen Composite-Return-Typ implementieren (ähnlich dem, was ich gerade gezeigt habe, aber einfacher), der für Ihre Situation spezifischer ist.

1

In C# 4 können Sie gleich wie Tuple tun, wie oben

von Staks beschrieben

aber unter C# 4, können Sie eine Liste zurück, die so viele enthält als Werte, die Sie zurückgeben möchten.

0

Ein Array ist nicht sehr günstig, da Sie nur eine Reihe von Elementen haben, ohne weitere Informationen über sie wirklich. Der Anrufer muss irgendwie "wissen", welches Element nicht. 0, Elementnr. 1 ist.

In einem solchen Fall würde ich immer für die Verwendung einer Klasse wählen - definieren Sie einen Rückgabetyp als eine Klasse, geben Sie den einzelnen Feldern aussagekräftige Namen. Eine Klasse gibt Ihnen Auffindbarkeit (durch Feldnamen), die Fähigkeit, die Rückgabetypen zu mischen (Rückkehr ein INT, zwei DECIMAL, ein STRING), und es kapselt schön Ihre Ergebnisse:

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

und dann Ihre Methode definieren :

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 danke für die Information noch nie so gesehen. Aber wie genau verbinde ich diese Eigenschaften von der ResultType-Klasse mit meiner Methode, wo die Berechnungen stattfinden?Grüße. – Tonz

+0

Ich sehe keinen Grund, diese Klasse veränderbar zu machen. Es hat keine Identität abgesehen von den Werten, die es enthält. – CodesInChaos

+0

@Tonz: aktualisiert meine Antwort zu zeigen - nur instanziieren Sie eine Instanz der Klasse, legen Sie die Eigenschaften auf Werte Ihrer Auswahl und geben Sie diese Instanz –

0

würde ich eine Klasse für den Zweck, der selbst eine einfache Struktur erstellen, sondern ein Tuple (wie stakx vorgeschlagen) ist nur so gut, und sogar eine Liste oder eine Sammlung der Trick tun kann.

+0

+1 für Struktur, da es den GC speichern würde, die eine Klasse oder ein Array verursachen würde –

Verwandte Themen