Return mehrere Werte an eine Methode Aufrufer
Lese ich die C++ - version dieser Frage aber nicht wirklich verstanden.
Kann mir bitte jemand klar und deutlich erklären, wenn es getan werden kann und wie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden .NET 4.0+'s-Tupel:
Beispiel:
Tupel mit zwei Werten haben
Item1
undItem2
als Eigenschaften.public (int sum, int count) GetMultipleValues() { return (1, 2); }
Dieses Beispiel stammt aus unsere Dokumentation Thema Beispiel auf dieser.Nun, dass C# 7 veröffentlicht wurde, können Sie mit der neuen im Lieferumfang enthalten Tupeln syntax
könnte dann z.B. so verwendet werden:
Können Sie auch die Namen Ihrer Elemente (Sie sind also nicht "Item1", "Item2", etc). Sie können es durch hinzufügen einen Namen für die Signatur oder die Rückkehr Methoden:
oder
Können Sie auch dekonstruiert werden, was ein ziemlich nettes neues feature:
Check-out dieser link mehr Beispiele zu sehen, was getan werden kann 🙂
Können Sie drei verschiedene Möglichkeiten,
1. ref /out-Parameter
mit ref:
out:
2. struct /class
mit struct:
mit Klasse:
3. Tupel
Tuple-Klasse
C# 7-Tupel
Können Sie nicht tun, diese in C#. Was Sie tun können, ist eine
out
parameter oder Rückgabe Ihrer eigenen Klasse (oder struct, wenn Sie wollen, dass es unveränderbar).Mithilfe der out-parameter
Mit custom class (oder struct)
async
Methoden.Tuple
ist der Weg zu gehen. (Ich benutzeout
Parameter in synchroner Operationen, obwohl; Sie sind in der Tat nützlich sein in diesen Fällen.)Wenn du meinst Rückgabe mehrere Werte können Sie entweder zurückgeben, eine Klasse/Struktur enthält die Werte, die Sie zurückgeben möchten, oder verwenden Sie die "out" Schlüsselwort auf Ihre Parameter, etwa so:
Bisherigen poster Recht. Sie können nicht zurückgeben mehrerer Werte aus einer C# - Methode. Sie haben jedoch ein paar Optionen:
Die vor-und Nachteile hier sind oft schwer herauszufinden. Wenn Sie eine Struktur, stellen Sie sicher, es ist klein, weil structs sind value-Typ und auf den stack gelegt. Wenn Sie eine Instanz einer Klasse, gibt es einige design-patterns hier, dass Sie möglicherweise verwenden möchten, um zu vermeiden, dass Probleme - Mitglieder der Klassen geändert werden können, da C# übergibt Objekte per Referenz (die Sie nicht haben, ByVal wie in VB).
Schließlich können Sie die Ausgabe-Parameter würde ich aber begrenzen Sie die Nutzung dieser Szenarien, wenn Sie nur ein paar (3 oder weniger) der Parameter - sonst werden die Dinge unschön und schwer zu pflegen. Auch die Verwendung von output-Parametern kann ein inhibitor der Beweglichkeit, weil Sie Ihre Methode, die Signatur zu ändern jedes mal müssen Sie etwas hinzufügen, um die Rückkehr Wert in der Erwägung, dass die Rückgabe einer struct oder class-Instanz können Sie Mitglieder hinzufügen, ohne änderungen an der Signatur der Methode.
Aus architektonischer Sicht würde ich empfehlen gegen die Verwendung von Schlüssel-Wert-Paare oder Wörterbücher. Ich finde diese Art der Codierung erfordert "geheimes wissen" im code, verbraucht der Methode. Es muss im Voraus wissen, was die Schlüssel sind und was die Werte bedeuten und ob die Entwickler auf die interne Implementierung ändert die Art, wie das Wörterbuch oder KVP ist geschaffen, es könnte leicht erstellen Sie eine Fehler-Kaskade während der gesamten Anwendung.
Exception
wenn der zweite Wert, den Sie zurückgeben möchten, ist die disjunkte aus die erste: wie, wenn Sie zurückkehren möchten, entweder eine Art von erfolgreichen Wert, oder eine Art erfolgloser Wert.Du entweder zurückgeben Instanz der Klasse oder verwenden Sie aus Parameter. Hier ist ein Beispiel out-Parameter:
Nennen mag:
Gibt es mehrere Möglichkeiten, dies zu tun. Sie können
ref
Parameter:Diese übergibt eine Referenz auf die Funktion und somit ist die Funktion zum ändern des Objekts in der aufrufenden code-stack. Dies ist, zwar nicht technisch ein "zurück" - Wert es ist ein Weg, um eine Funktion etwas ähnliches tun. In den obigen code die Funktion zurückkehren würde, ein
int
und (potenziell) ändernbar
.Anderen ähnlichen Ansatz ist die Verwendung einer
out
parameter. Einout
parameter ist identisch zu einemref
parameter mit einem zusätzlichen, compiler erzwungen Regel. Diese Regel ist, dass, wenn Sie übergeben eineout
parameter in einer Funktion, die Funktion wird benötigt, um Ihren Wert vor der Rückgabe. Außerdem gilt, dass einout
parameter funktioniert genau wie einref
parameter.Den Endanflug (und das am besten in den meisten Fällen) ist das erstellen einer Art Gesamtschau beider Werte und die Funktion ermöglichen zurückkehren:
Dieser Letzte Ansatz ist einfacher und leichter zu Lesen und zu verstehen.
Nein, können Sie nicht zurückgeben mehrerer Werte aus einer Funktion in C# (für Versionen niedriger als C# 7), zumindest nicht in der Weise, die Sie tun können, es in Python.
Allerdings gibt es ein paar alternativen:
Können Sie die Rückgabe ein array vom Typ object mit der mehrere Werte, die Sie wollen in ihm.
Können Sie
out
Parameter.In C# 4, werden Sie in der Lage, mithilfe der integrierten Unterstützung für Tupeln, die dies leicht zu handhaben.
In der Zwischenzeit gibt es zwei Möglichkeiten.
Ersten, die Sie verwenden können, ref-oder out-Parameter zum zuweisen von Werten an die Parameter, die übergeben wieder an die aufrufende routine.
Diese sieht wie folgt aus:
Zweitens können Sie wickeln Ihre Rückgabewerte in eine Struktur oder Klasse, und übergeben Sie Sie wieder als Mitglieder dieser Struktur. KeyValuePair funktioniert gut für 2 - für mehr als 2 brauchst du ein custom class oder struct.
In C#7 Es gibt eine neue
Tuple
syntax:Zurück können Sie dies als einen Datensatz:
Können Sie auch die neue deconstructor syntax:
Vorsichtig sein mit dem serialisieren jedoch, all dies ist syntaktischer Zucker im eigentlichen kompilierte code wird dies ein
Tupel<string, int>
(wie pro die akzeptierte Antwort) mitItem1
undItem2
stattfoo
undbar
. Das bedeutet, dass serialisieren (oder deserialisation), verwenden diese Eigenschaft, dass Namen statt.So, für serialisieren deklarieren Sie einen record-Klasse und Rendite, statt.
Ebenfalls neu in C#7 ist eine verbesserte syntax für
out
Parameter. Können Sie jetzt erklären, dieout
inline, was ist besser geeignet, in bestimmten Kontexten:Aber meist werden Sie verwenden Sie diese .NET-eigenen Bibliotheken, anstatt Sie in eigenen Funktionen.
Anderen Antworten angegeben mit Tupel, das würde ich empfehlen, auch, aber mit dem neuen feature in C# 7.0.
Weitere Informationen finden Sie hier.
können Sie versuchen, diese "KeyValuePair"
Ausgabe :
Ausgabe : 1, 2
Klassen, Strukturen, Collections und Arrays können mehrere Werte enthalten. Ausgangs-und Referenz-Parameter können Sie auch in eine Funktion. Rückgabe mehrerer Werte möglich ist, in dynamischen und funktionalen Sprachen mit Hilfe von Tupeln, aber nicht in C#.
Hauptsächlich zwei Methoden gibt es.
1. Verwenden Sie die out - /ref-Parameter
2. Liefert ein Array von Objekten
Hier sind grundlegende
Two
Methoden:1) die Nutzung der '
out
' als parameterSie können 'aus' für beide 4.0 und minor-Versionen zu.
Beispiel von 'out':
Ausgabe:
Fläche des Rechtecks ist 20
Umfang von Rechteck ist 18
*Hinweis:*Die
out
-Schlüsselwort beschreibt Parameter, deren tatsächliche variable Speicherorte kopiert werden, auf den stack der aufgerufenen Methode, wo die gleichen stellen geschrieben werden kann. Dies bedeutet, dass die aufrufende Methode auf das zu verändernde parameter.2)
Tuple<T>
Beispiel-Tupel:
Rückkehr Mehrere DataType-Werte mit
Tuple<T>
Ausgabe
HINWEIS: Verwendung der Tupel ist gültig ab dem Framework 4.0 und höher.
Tuple
Typ ist einclass
. Es wird vergeben werden in einen separaten Speicherort auf dem verwalteten heap im Speicher. Wenn Sie erstellen dieTuple
Sie können nicht ändern, die Werte seinerfields
. Dies macht dieTuple
mehr wie einstruct
.Eine Methode, wobei ein Delegierter kann mehrere Werte an den Aufrufer. Dieser leiht sich von meiner Antwort hier und verwendet ein wenig von Hadas ist die akzeptierte Antwort.
Anrufer einen lambda (oder eine benannte Funktion) und intellisense hilft Ihnen, kopieren Sie die Variablen-Namen von den Delegierten.
Nur die Verwendung in OOP-Manier ein Klasse wie folgt aus:
Funktion Mitglied gibt der quotient die meisten Anrufer sind in Erster Linie interessiert. Zusätzlich speichert es den Rest als Daten-member, die leicht zugänglich durch die Anrufer danach.
Diese Weise können Sie viele weitere "Rückkehr der Werte", sehr nützlich, wenn Sie implementieren von Datenbank-oder Netzwerk-Anrufe, wo eine Menge von Fehlermeldungen, die möglicherweise notwendig werden, aber nur im Fall, dass ein Fehler Auftritt.
Betrat ich diese Lösung auch in C++ Frage, dass OP sich bezieht.
Vom diese Artikel, die Sie verwenden können drei Optionen posts wie oben gesagt.
KeyValuePair ist der Schnellste Weg.
aus ist bei der zweiten.
Tupel ist die langsamste.
Sowieso, das ist von dem abhängig, was ist das beste für Ihr Szenario.
Zukünftigen version von C# wird named Tupel.
Haben Sie einen Blick auf das channel9-Sitzung für die demo
https://channel9.msdn.com/Events/Build/2016/B889
Überspringen, um 13:00 Uhr-für das Tupel Zeug. Dies wird es ermöglichen, Sachen wie:
(unvollständige Beispiel aus dem video)
Könnten Sie ein dynamisches Objekt. Ich denke, es hat bessere Lesbarkeit als Tupel.
Können Sie erhalten code wie
Ich hoffe, dass es funktioniert.
Möglichkeiten, es zu tun:
1) KeyValuePair (Beste Leistung - 0.32 ns):
2) Tupel - 5.40 ns:
3) aus (1.64, ns) oder ref
4) Erstellen Sie Ihre eigenen benutzerdefinierten Klasse/struct
ns -> Nanosekunden
Referenz: mehrere return-Werte.
können Sie versuchen, diese
yield return "value1"; yield return "value2";
nicht explizit erstellen Sie eine neuestring[]
?Können Sie auch ein OperationResult
Heute, Programmierer Zeit brauchen, & unforgotable Methoden.
Eine einfache, funktionierende und schnelle Lösung:
Verwendung in irgendwo;