645 Stimmen

Mehrere Werte an einen Methodenaufrufer zurückgeben

Ich habe die C++-Version dieser Frage aber ich habe es nicht wirklich verstanden.

Kann jemand bitte klar erklären, wenn es in C# getan werden kann, und wie?

0 Stimmen

Basierend auf der Antwort auf die erwähnte Frage, in C/C++ & vor dem Variablennamen bedeutet "pass by reference", mit Referenzparametern können Sie die Variable an die Funktion übergeben und ihren Wert innerhalb der Funktion ändern, in C# können Sie es mit ref / out Parametern tun

42voto

Chris Doggett Punkte 18701

Wenn Sie mehrere Werte zurückgeben wollen, können Sie entweder eine Klasse/Struktur zurückgeben, die die Werte enthält, die Sie zurückgeben wollen, oder das Schlüsselwort "out" für Ihre Parameter verwenden, etwa so:

public void Foo(int input, out int output1, out string output2, out string errors) {
    // set out parameters inside function
}

37voto

nzrytmn Punkte 4812

Es gibt viele Möglichkeiten, aber wenn Sie kein neues Objekt oder keine neue Struktur oder ähnliches erstellen wollen, können Sie wie folgt vorgehen C# 7.0 :

 (string firstName, string lastName) GetName(string myParameter)
    {
        var firstName = myParameter;
        var lastName = myParameter + " something";
        return (firstName, lastName);
    }

    void DoSomethingWithNames()
    {
        var (firstName, lastName) = GetName("myname");

    }

35voto

Kevin Hoffman Punkte 5144

Der Vorposter hat Recht. Sie können nicht mehrere Werte aus einer C#-Methode zurückgeben. Allerdings haben Sie ein paar Optionen:

  • Rückgabe einer Struktur, die mehrere Mitglieder enthält
  • Rückgabe einer Instanz einer Klasse
  • Verwenden Sie die Ausgabeparameter (mit der Option aus ou ref Schlüsselwörter)
  • Verwenden Sie ein Wörterbuch oder ein Schlüssel-Wert-Paar als Ausgabe

Die Vor- und Nachteile sind hier oft schwer abzuschätzen. Wenn Sie eine Struktur zurückgeben, achten Sie darauf, dass sie klein ist, denn Strukturen sind vom Typ Wert und werden auf dem Stack übergeben. Wenn Sie eine Instanz einer Klasse zurückgeben, gibt es hier einige Entwurfsmuster, die Sie vielleicht verwenden möchten, um Probleme zu vermeiden - Mitglieder von Klassen können geändert werden, weil C# Objekte per Referenz übergibt (Sie haben kein ByVal wie in VB).

Schließlich können Sie auch Ausgabeparameter verwenden, aber ich würde dies auf Szenarien beschränken, in denen Sie nur wenige (z. B. 3 oder weniger) Parameter haben - andernfalls werden die Dinge hässlich und schwer zu pflegen. Außerdem kann die Verwendung von Ausgabeparametern die Agilität einschränken, da die Signatur Ihrer Methode jedes Mal geändert werden muss, wenn Sie dem Rückgabewert etwas hinzufügen wollen, während Sie bei der Rückgabe einer Struktur oder Klasseninstanz Mitglieder hinzufügen können, ohne die Signatur der Methode zu ändern.

Vom architektonischen Standpunkt aus würde ich von der Verwendung von Schlüssel-Wert-Paaren oder Wörterbüchern abraten. Meiner Meinung nach erfordert diese Art der Codierung "geheimes Wissen" im Code, der die Methode verwendet. Er muss im Voraus wissen, wie die Schlüssel lauten werden und was die Werte bedeuten, und wenn der Entwickler, der an der internen Implementierung arbeitet, die Art und Weise ändert, wie das Wörterbuch oder das KVP erstellt wird, kann dies leicht zu einer Fehlerkaskade in der gesamten Anwendung führen.

24voto

Keltex Punkte 25852

Sie geben entweder eine Klasseninstanz oder verwenden aus Parameter. Hier ist ein Beispiel für unsere Parameter:

void mymethod(out int param1, out int param2)
{
    param1 = 10;
    param2 = 20;
}

Sagen wir es so:

int i, j;
mymethod(out i, out j);
// i will be 20 and j will be 10

17voto

Luis Teijon Punkte 4413

Einige Antworten empfehlen die Verwendung von out-Parameter aber ich empfehle dies nicht zu verwenden, da sie funktionieren nicht mit asynchronen Methoden . Siehe diese für weitere Informationen.

Andere Antworten gaben an, Tuple zu verwenden, was ich auch empfehlen würde, aber unter Verwendung der neuen Funktion, die in C# 7.0 eingeführt wurde.

(string, string, string) LookupName(long id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
    return (first, middle, last); // tuple literal
}

var names = LookupName(id);
WriteLine($"found {names.Item1} {names.Item3}.");

Weitere Informationen finden Sie unter aquí .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X