| 

.NET C# Java Javascript Exception

7
Ich kann aus einer Funktion heraus nur einen Wert zurückgeben:
public MyClass GetValue()
{
return new MyClass();
}


gibt es auch eine Möglichkeit, zwei Werte zurückzugeben? Also irgendwie so:
public MyClass, string GetValue()
{
return new MyClass(), "Hallo";
}
27.01.2011
salomeika 73 1 5
8 Antworten
14
Prinzipiell hast Du drei Möglichkeiten:

  • Ein entsprechendes Objekt bauen, das die passenden Eigenschaften enthält
  • Eine passende Instanz der Tuple-Klasse zurückgeben
  • Mehrere out-Parameter verwenden

Von der Qualität her würde ich die drei Punkte in genau dieser Reihenfolge präferieren.
27.01.2011
Golo Roden 2,7k 3 9
8
Nur noch Beispiele zu Golos Antwort:
# Ein entsprechendes Objekt bauen, das die passenden Eigenschaften enthält
class Result{ public MyClass cls; public string someString; }
public Result GetValue()
{
return new Result{cls=new MyClass(), someString = "hu"};
}


# Eine passende Instanz der Tuple-Klasse zurückgeben
public Tuple<MyClass,string> GetValue()
{
return new Tuple<MyClass,string>(new MyClass(),"hoi");
}


# Mehrere out-Parameter verwenden
public MyClass GetValue(out string thestr)
{
thestr = "raus";
return new MyClass();
}
public string GetValue1(out MyClass obj)
{
obj = new MyClass();
return "raus";
}
public void GetValue2(out MyClass obj, out string thestr)
{
obj = new MyClass();
thestr = "raus";
}
28.01.2011
DaSpors 4,2k 2 8
Danke für die Illustration. Das macht es plastischer.
salomeika 03.02.2011
3
Nein. Meines Wissens gibt es das nicht. Eine Funktion kann nur einen Wert zurückgeben. Aber du kannst die Referenz auf ein Objekt übergeben und die Methode verändert dann die Eigenschaften des Objekts. Damit kann eine Methode beliebig viele Werte "zurückgeben". Ob das sinnvoll ist, steht auf einem anderen Blatt (Single Responsibility Principle).
27.01.2011
Booda 33 1 3
2
Als weteere Möglichkeit ist die Rückgabe einer Structure zu erwähnen (eigentlich nur Unterfall der Rückgabe eines Objekts).
Die wichtigste Frage ist, ob es wirklich notwendig ist, mehrere Werte zurückzugeben. Zunächst sollte man Logik und Design der Funktion überprüfen. Welche der vier Methoden (Rückgabe eines Objekts, Rückgabe eines Tupels, Out-Parameter oder Ubergabe eines Objekts) verwendet werden soll, hängt dann vom Zweck der Funktion ab. Soll mit den Werten ein Objekt (dazu gehört auch eine Collection, ein Array oder eine Liste) erzeugt werden, bietet sich an, die Objekterzeugung in die Funktion zu verlagern. Soll ein existierendes Objekt konfiguriert werden, bietet sich an das Objekt als Parameter an eine Funktion zu übergeben. In allen anderen Fällen sollte überprüft werden, ob die Funktion wirklich mehrere Werte zurückgeben muss, oder nicht aufgesplittet werden sollte. Wenn ja, ist m. E. zu unterscheiden:
-Stehen die Werte in einer logischen Beziehung zueinander, und besteht nicht die geringste Veranlassung dazu, ein Objekt oder eine Structure zu verwenden, bietet sich nunmehr ein Tupel als Rückgabewert an.
-In allen anderen Fällen sollten Out-Parameter verwendet werden. Dazu gehört auch der Fall, dass die Funktion einen Statuswert neben dem "eigentlichen" Rückgabewert zurückgeben soll. Dann ist üblicherweise der Statuswert der formale Rückgabewert und der andere Wert der Out-Parameter.
05.02.2011
Hajo Messner 41 1
1
Die einfache Alternative kann man auch mit einem Tuple (seit 4.0) realisieren.

Das sieht dann so aus:

static Tuple<int, int, string> Div(int a, int b)
{
int r1 = a / b;
int r2 = a % b;

return Tuple.Create(r1, r2, "Watt schönes");
}


Das Tuple kann dann mehrere Werte haben. Einfach mal googlen.
04.02.2011
Hinderks 71 4
0
Ich würde auch die Objekt-Methode verwenden. Allerdings stimme ich Booda zu: Single Response Principle. Um das zu mißachten, hast du sicher sehr gute Gründe.
04.02.2011
1
Anmerkungen zu Antworten sollten als Kommentar verfasst werden da dies hier kein Forum ist. Unter "Antworten" versteht man konkrete oder abstracte Lösungsansätze.
Floyd 04.02.2011
0
Einen Datentypen einführen, weil man aus einer Funktion mehrere Werte zurückgeben muss? Geschmackssache. Mehrere Out-Parameter sind in der Benutzung m. E. vielseitiger, weil der Aufrufer verschiedene Felder unterschiedlicher Objekte damit initialisieren bzw. füllen kann. Früher hat man das so gemacht. Fragt sich dann, wozu man das Konzept der Funktion braucht (die nur einen Wert zurückgibt) - vielleicht braucht man es nicht unbedingt.
04.02.2011
1
Anmerkungen zu Antworten sollten als Kommentar verfasst werden da dies hier kein Forum ist. Unter "Antworten" versteht man konkrete oder abstracte Lösungsansätze.
Floyd 04.02.2011
0
Ich würde die Rückgabe von Strukturen favorisieren (Stichwort Boxing / Unboxing)
Kommt aber auch d'rauf an, was man genau machen will.
07.02.2011
Batman 149 2 6

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH