Ich bin neu in C # mit C-Programmierhintergrund, entschuldige wahrscheinlich eine grundlegende Frage. Ich versuche, den besten Weg zu finden, um ein Array von Werten von einer Methode zurückzugeben.

In C können wir eine der folgenden Aktionen ausführen:

  1. void myFuction(double[] inputA, int lenA, double* outputA): Die Funktion ruft das Eingabearray "inputA" der Länge "lenA" ab und gibt den Zeiger "outputA" zurück, dem vor dem Aufruf von "myFunction" Speicher zugewiesen wurde und der in der Funktion "myFunction" ausgefüllt wurde. .

  2. double* myFunction (double[] inputA, int lenA): Alternativ kann Speicher innerhalb von "myFucntion" basierend auf einer gewünschten Länge zugewiesen, gefüllt und als "return outputA" zurückgegeben werden.

Was ist der beste Weg, dies in C # zu tun?

c#
0
MikeG 17 Aug. 2020 im 16:46

2 Antworten

Beste Antwort

C # erlaubt auch beide Methoden, jedoch werden Arrays auch in Rückgaben anstelle des * Zeigers mit [] bezeichnet.

double[] myFunction(double[] inputA, int lenA)
{
   double[] output = new double[lengthOfArray];
   ...
   return output;
}

Alternativ erlaubt c # einen "out" -Parameter, der auf ähnliche Weise verwendet werden kann.

 void myFunction(double[] inputA, int lenA, out double[] output)
 {
      ...
      output = ...
      //OR
      output[0] = 1; //replace 0 with index #
 }

Beides sind akzeptable Praktiken, wobei das erste Beispiel die üblichere Methode ist, um es in c # für lesbare und organisatorische Zwecke auszuführen.

1
oppassum 17 Aug. 2020 im 13:51

Was ist der beste Weg, dies in C # zu tun?

Zeiger werden fast nie direkt in C # verwendet, daher würde die idiomatische Signatur Arrays verwenden:

double[] myFunction (double[] inputA, int lenA)

Beachten Sie jedoch, dass Sie in C # auch die Länge eines Arrays sehr einfach ermitteln können (int len = inputA.Length), sodass lenA möglicherweise nicht benötigt wird, es sei denn, Sie möchten die Verarbeitung einer Teilmenge von unterstützen das Array.

Im weiteren Verlauf werden Sie feststellen, dass andere Datenstrukturen wie List und Schnittstellen wie IEnumerable je nach Anwendungsfall vorzuziehen sind (dh Sie können entscheiden, dass die Funktion nur eine iterierbare Sammlung ohne Angabe zurückgeben soll der tatsächliche Typ dieser Sammlung).

Als Randnotiz (und von jemandem, der von C ++ zu C # gewechselt ist) ist das Beste, was Sie tun können, C # NICHT als "Erweiterung" oder "Alternative" zu C ++ zu betrachten. Während die Syntax und die Typen sehr ähnlich sind, macht C # als verwaltete Sprache viele grundlegende Dinge sehr unterschiedlich, so dass Sie sich möglicherweise einschränken, wenn Sie nur versuchen, C ++ - Code nach C # zu "portieren". Versuchen Sie, es als eine brandneue Sprache und ein brandneues Framework mit einigen Syntaxüberschneidungen zu betrachten.

3
D Stanley 17 Aug. 2020 im 13:56