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

10voto

Reed Copsey Punkte 536986

In C# 4 werden Sie in der Lage sein, die integrierte Unterstützung für Tupel zu nutzen, um dies einfach zu handhaben.

In der Zwischenzeit gibt es zwei Möglichkeiten.

Erstens können Sie ref- oder out-Parameter verwenden, um Ihren Parametern Werte zuzuweisen, die dann an die aufrufende Routine zurückgegeben werden.

Das sieht so aus:

void myFunction(ref int setMe, out int youMustSetMe);

Zweitens können Sie Ihre Rückgabewerte in eine Struktur oder Klasse verpacken und sie als Elemente dieser Struktur zurückgeben. KeyValuePair funktioniert gut für 2 - für mehr als 2 würden Sie eine benutzerdefinierte Klasse oder Struktur benötigen.

5voto

Jose Basilio Punkte 49489

Klassen, Strukturen, Sammlungen und Arrays können mehrere Werte enthalten. Ausgabe- und Referenzparameter können auch in einer Funktion gesetzt werden. Die Rückgabe mehrerer Werte ist in dynamischen und funktionalen Sprachen mit Hilfe von Tupeln möglich, nicht aber in C#.

4voto

SHEKHAR SHETE Punkte 5758

Hier sind grundlegende Two Methoden:

1) Verwendung von out ' als Parameter Sie können 'out' auch für 4.0 und kleinere Versionen verwenden.

Beispiel für "out":

using System;

namespace out_parameter
{
  class Program
   {
     //Accept two input parameter and returns two out value
     public static void rect(int len, int width, out int area, out int perimeter)
      {
        area = len * width;
        perimeter = 2 * (len + width);
      }
     static void Main(string[] args)
      {
        int area, perimeter;
        // passing two parameter and getting two returning value
        Program.rect(5, 4, out area, out perimeter);
        Console.WriteLine("Area of Rectangle is {0}\t",area);
        Console.WriteLine("Perimeter of Rectangle is {0}\t", perimeter);
        Console.ReadLine();
      }
   }
}

出力します。

Fläche des Rechtecks ist 20

Der Umfang des Rechtecks beträgt 18

* Anmerkung: *Die out -Schlüsselwort beschreibt Parameter, deren tatsächliche Variablenpositionen auf den Stack der aufgerufenen Methode kopiert werden, wo dieselben Positionen neu geschrieben werden können. Dies bedeutet, dass die aufrufende Methode auf den geänderten Parameter zugreifen wird.

2) Tuple<T>

Beispiel für Tupel:

Rückgabe mehrerer DataType-Werte mit Tuple<T>

using System;

class Program
{
    static void Main()
    {
    // Create four-item tuple; use var implicit type.
    var tuple = new Tuple<string, string[], int, int[]>("perl",
        new string[] { "java", "c#" },
        1,
        new int[] { 2, 3 });
    // Pass tuple as argument.
    M(tuple);
    }

    static void M(Tuple<string, string[], int, int[]> tuple)
    {
    // Evaluate the tuple's items.
    Console.WriteLine(tuple.Item1);
    foreach (string value in tuple.Item2)
    {
        Console.WriteLine(value);
    }
    Console.WriteLine(tuple.Item3);
    foreach (int value in tuple.Item4)
    {
        Console.WriteLine(value);
    }
    }
}

Sortie

perl
java
c#
1
2
3

HINWEIS: Die Verwendung von Tupel gilt ab Framework 4.0 und höher . Tuple Typ ist ein class . Sie wird an einem separaten Ort auf dem verwalteten Heap im Speicher zugewiesen. Sobald Sie die Tuple können Sie die Werte seiner fields . Dies macht die Tuple mehr wie ein struct .

4voto

blitzkriegz Punkte 8948

Es gibt im Wesentlichen zwei Methoden. 1. Out/Ref-Parameter verwenden 2. Rückgabe eines Arrays von Objekten

3voto

Scott Turner Punkte 227

Eine Methode, die einen Delegaten nimmt, kann dem Aufrufer mehrere Werte liefern. Dies ist eine Anleihe aus meiner Antwort aquí und verwendet ein wenig von Hadas' akzeptierte Antwort .

delegate void ValuesDelegate(int upVotes, int comments);
void GetMultipleValues(ValuesDelegate callback)
{
    callback(1, 2);
}

Der Aufrufer stellt ein Lambda (oder eine benannte Funktion) bereit, und Intellisense hilft durch Kopieren der Variablennamen aus dem Delegaten.

GetMultipleValues((upVotes, comments) =>
{
     Console.WriteLine($"This post has {upVotes} Up Votes and {comments} Comments.");
});

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