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?
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?
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
}
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");
}
Der Vorposter hat Recht. Sie können nicht mehrere Werte aus einer C#-Methode zurückgeben. Allerdings haben Sie ein paar Optionen:
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.
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 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.
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