Ich habe die C ++ - Version dieser Frage gelesen , aber nicht wirklich verstanden.
Kann jemand bitte klar erklären, ob und wie es geht?
Ich habe die C ++ - Version dieser Frage gelesen , aber nicht wirklich verstanden.
Kann jemand bitte klar erklären, ob und wie es geht?
In C # 7 und höher finden Sie diese Antwort .
In früheren Versionen können Sie das Tupel von .NET 4.0 + verwenden :
Zum Beispiel:
public Tuple<int, int> GetMultipleValue()
{
return Tuple.Create(1,2);
}
Tupel mit zwei Werten haben Item1
und Item2
als Eigenschaften.
public (int sum, int count) GetMultipleValues() { return (1, 2); }
Dieses Beispiel stammt aus unserem Beispiel zum Thema Dokumentation .Nachdem C # 7 veröffentlicht wurde, können Sie die neu enthaltene Tuples-Syntax verwenden
was dann so verwendet werden könnte:
Sie können Ihren Elementen auch Namen geben (sie sind also nicht "Item1", "Item2" usw.). Sie können dies tun, indem Sie der Signatur oder den Rückgabemethoden einen Namen hinzufügen:
oder
Sie können auch dekonstruiert werden, was eine ziemlich nette neue Funktion ist:
Schauen Sie sich diesen Link an, um weitere Beispiele zu sehen, was getan werden kann :)
quelle
Sie können drei verschiedene Möglichkeiten verwenden
1. Ref / Out-Parameter
mit ref:
Verwenden von:
2. Struktur / Klasse
using struct:
using class:
3. Tupel
Tupelklasse
C # 7 Tupel
quelle
Sie können dies nicht in C # tun. Was Sie tun können, ist eine
Parameter out verwenden Verwenden einer benutzerdefinierten Klasse (oder Struktur)out
Parameter haben oder eine eigene Klasse zurückgeben (oder eine Struktur, wenn diese unveränderlich sein soll).quelle
async
Methoden nicht möglich .Tuple
ist der Weg zu gehen. (Ich verwende jedochout
Parameter in synchronen Operationen; sie sind in diesen Fällen tatsächlich nützlich.)Wenn Sie mehrere Werte zurückgeben möchten, können Sie entweder eine Klasse / Struktur zurückgeben, die die Werte enthält, die Sie zurückgeben möchten, oder das Schlüsselwort "out" für Ihre Parameter verwenden, z.
quelle
Vorheriges Poster ist richtig. Sie können nicht mehrere Werte von einer C # -Methode zurückgeben. Sie haben jedoch einige Möglichkeiten:
Die Vor- und Nachteile sind hier oft schwer herauszufinden. Wenn Sie eine Struktur zurückgeben, stellen Sie sicher, dass sie klein ist, da Strukturen vom Werttyp sind und an den Stapel übergeben werden. Wenn Sie eine Instanz einer Klasse zurückgeben, gibt es hier einige Entwurfsmuster, die Sie möglicherweise verwenden möchten, um Probleme zu vermeiden. Mitglieder von Klassen können geändert werden, da C # Objekte als Referenz übergibt (Sie haben ByVal nicht wie in VB ).
Schließlich können Sie Ausgabeparameter verwenden, aber ich würde die Verwendung auf Szenarien beschränken, in denen Sie nur ein paar (wie 3 oder weniger) Parameter haben - andernfalls werden die Dinge hässlich und schwer zu warten. Die Verwendung von Ausgabeparametern kann auch die Agilität beeinträchtigen, da sich Ihre Methodensignatur jedes Mal ändern muss, wenn Sie dem Rückgabewert etwas hinzufügen müssen, während Sie bei der Rückgabe einer Struktur- oder Klasseninstanz Mitglieder hinzufügen können, ohne die Methodensignatur zu ändern.
Aus architektonischer Sicht würde ich empfehlen, keine Schlüssel-Wert-Paare oder Wörterbücher zu verwenden. Ich finde, dass diese Art der Codierung "geheimes Wissen" in Code erfordert, der die Methode verbraucht. Es muss im Voraus wissen, wie die Schlüssel lauten und was die Werte bedeuten. Wenn der Entwickler, der an der internen Implementierung arbeitet, die Art und Weise ändert, in der das Wörterbuch oder KVP erstellt wird, kann dies leicht zu einer Fehlerkaskade in der gesamten Anwendung führen.
quelle
Exception
Wert auslösen, wenn der zweite Wert, den Sie zurückgeben möchten, nicht mit dem ersten Wert übereinstimmt: Zum Beispiel, wenn Sie entweder eine Art erfolgreichen Wert oder eine Art erfolglosen Wert zurückgeben möchten.Sie entweder eine Rückkehr Klasseninstanz oder verwenden out - Parameter. Hier ist ein Beispiel für unsere Parameter:
Nennen Sie es so:
quelle
Es gibt viele Wege; Wenn Sie jedoch kein neues Objekt oder keine neue Struktur oder ähnliches erstellen möchten, können Sie dies nach C # 7.0 wie folgt tun :
quelle
In C # 7 gibt es eine neue
Tuple
Syntax:Sie können dies als Datensatz zurückgeben:
Sie können auch die neue Dekonstruktorsyntax verwenden:
Seien Sie jedoch vorsichtig mit der Serialisierung, dies ist alles syntaktischer Zucker - im tatsächlich kompilierten Code ist dies ein
Tuple<string, int>
( gemäß der akzeptierten Antwort ) mitItem1
undItem2
anstelle vonfoo
undbar
. Das bedeutet, dass bei der Serialisierung (oder Deserialisierung) stattdessen diese Eigenschaftsnamen verwendet werden.Deklarieren Sie für die Serialisierung eine Datensatzklasse und geben Sie diese stattdessen zurück.
Ebenfalls neu in C # 7 ist eine verbesserte Syntax für
out
Parameter. Sie können jetzt dieout
Inline deklarieren , die in einigen Kontexten besser geeignet ist:Meistens verwenden Sie dies jedoch in .NET-eigenen Bibliotheken und nicht in Ihren eigenen Funktionen.
quelle
Andere Antworten wurden mit Tuple angegeben, was ich auch empfehlen würde, aber mit der neuen Funktion, die in C # 7.0 eingeführt wurde.
Weitere Informationen finden Sie hier .
quelle
Es gibt verschiedene Möglichkeiten, dies zu tun. Sie können
ref
Parameter verwenden:Dies übergibt einen Verweis auf die Funktion, wodurch die Funktion das Objekt im Stapel des aufrufenden Codes ändern kann. Obwohl dies technisch gesehen kein "zurückgegebener" Wert ist, ist es eine Möglichkeit, eine Funktion etwas Ähnliches tun zu lassen. Im obigen Code würde die Funktion ein
int
und (möglicherweise) eine Änderung zurückgebenbar
.Ein anderer ähnlicher Ansatz ist die Verwendung eines
out
Parameters. Einout
Parameter ist identisch mit einemref
Parameter mit einer zusätzlichen, vom Compiler erzwungenen Regel. Diese Regel lautet: Wenn Sie einenout
Parameter an eine Funktion übergeben, muss diese Funktion ihren Wert vor der Rückgabe festlegen. Neben dieser Regelout
funktioniert ein Parameter genau wie einref
Parameter.Der letzte Ansatz (und in den meisten Fällen der beste) besteht darin, einen Typ zu erstellen, der beide Werte kapselt und es der Funktion ermöglicht, Folgendes zurückzugeben:
Dieser endgültige Ansatz ist einfacher und leichter zu lesen und zu verstehen.
quelle
Nein, Sie können nicht mehrere Werte von einer Funktion in C # zurückgeben (für Versionen unter C # 7), zumindest nicht so, wie Sie es in Python tun können.
Es gibt jedoch einige Alternativen:
Sie können ein Array vom Typ Objekt mit den gewünschten Werten zurückgeben.
Sie können
out
Parameter verwenden.quelle
In C # 4 können Sie die integrierte Unterstützung für Tupel verwenden, um dies einfach zu handhaben.
In der Zwischenzeit gibt es zwei Möglichkeiten.
Zunächst können Sie ref- oder out-Parameter verwenden, um Ihren Parametern Werte zuzuweisen, die an die aufrufende Routine zurückgegeben werden.
Das sieht so aus:
Zweitens können Sie Ihre Rückgabewerte in eine Struktur oder Klasse einschließen und sie als Mitglieder dieser Struktur zurückgeben. KeyValuePair funktioniert gut für 2 - für mehr als 2 benötigen Sie eine benutzerdefinierte Klasse oder Struktur.
quelle
Sie können dieses "KeyValuePair" ausprobieren
Ausgabe :
Ausgabe: 1, 2
quelle
Klassen, Strukturen, Sammlungen und Arrays können mehrere Werte enthalten. Ausgabe- und Referenzparameter können auch in einer Funktion eingestellt werden. Die Rückgabe mehrerer Werte ist in dynamischen und funktionalen Sprachen mithilfe von Tupeln möglich, jedoch nicht in C #.
quelle
Es gibt hauptsächlich zwei Methoden. 1. Verwenden Sie out / ref-Parameter. 2. Geben Sie ein Array von Objekten zurück
quelle
Hier sind grundlegende
Two
Methoden:1) Verwendung von '
out
' als Parameter Sie können 'out' sowohl für 4.0- als auch für Nebenversionen verwenden.Beispiel für 'out':
Ausgabe:
Die Fläche des Rechtecks beträgt 20
Der Umfang des Rechtecks beträgt 18
* Hinweis: * Das
out
Schlüsselwort -key beschreibt Parameter, deren tatsächliche Variablenpositionen auf den Stapel der aufgerufenen Methode kopiert werden, wo dieselben Positionen neu geschrieben werden können. Dies bedeutet, dass die aufrufende Methode auf den geänderten Parameter zugreift.2)
Tuple<T>
Beispiel für Tupel:
Rückgabe mehrerer DataType-Werte mit
Tuple<T>
Ausgabe
HINWEIS: Die Verwendung von Tuple ist ab Framework 4.0 gültig .
Tuple
Typ ist aclass
. Es wird an einem separaten Speicherort auf dem verwalteten Heap im Speicher zugewiesen. Sobald Sie das erstellt habenTuple
, können Sie die Werte nicht mehr ändernfields
. Dies macht dasTuple
eher wie einstruct
.quelle
Sie können Code wie erhalten
Ich hoffe es klappt.
quelle
Eine Methode, die einen Delegaten verwendet, kann dem Aufrufer mehrere Werte bereitstellen. Dies entlehnt meiner Antwort hier und verwendet ein wenig von Hadas akzeptierter Antwort .
Anrufer stellen ein Lambda (oder eine benannte Funktion) bereit, und Intellisense hilft beim Kopieren der Variablennamen vom Delegaten.
quelle
Verwenden Sie einfach in OOP-Weise eine Klasse wie diese:
Das Funktionselement gibt den Quotienten zurück, an dem die meisten Anrufer hauptsächlich interessiert sind. Außerdem speichert es den Rest als Datenelement, auf das der Anrufer anschließend leicht zugreifen kann.
Auf diese Weise können Sie viele zusätzliche "Rückgabewerte" haben, die sehr nützlich sind, wenn Sie Datenbank- oder Netzwerkaufrufe implementieren, bei denen viele Fehlermeldungen erforderlich sein können, jedoch nur im Falle eines Fehlers.
Ich habe diese Lösung auch in die C ++ - Frage eingegeben, auf die sich OP bezieht.
quelle
In diesem Artikel können Sie drei Optionen als oben genannte Beiträge verwenden.
KeyValuePair ist der schnellste Weg.
raus ist am zweiten.
Tupel ist das langsamste.
Dies hängt jedoch davon ab, was für Ihr Szenario am besten ist.
quelle
Die zukünftige Version von C # wird benannte Tupel enthalten. Schauen Sie sich diese Channel9-Sitzung für die Demo an https://channel9.msdn.com/Events/Build/2016/B889
Springe zu 13:00 für das Tupel-Zeug. Dies ermöglicht Dinge wie:
(unvollständiges Beispiel aus Video)
quelle
Sie können ein dynamisches Objekt verwenden. Ich denke, es hat eine bessere Lesbarkeit als Tuple.
quelle
Möglichkeiten, es zu tun:
1) KeyValuePair (beste Leistung - 0,32 ns):
2) Tupel - 5,40 ns:
3) out (1,64 ns) oder ref 4) Erstellen Sie Ihre eigene benutzerdefinierte Klasse / Struktur
ns -> Nanosekunden
Referenz: Multiple-Return-Werte .
quelle
Sie können dies versuchen
quelle
yield return "value1"; yield return "value2";
, um nicht explizit ein neues erstellen zu müssenstring[]
?Sie können auch ein OperationResult verwenden
quelle
Eine schnelle Antwort speziell für Array-Typ-Rückgaben:
Verwenden von:
quelle