3 Stimmen

Was war der Grund für die Entscheidung, dass variable Funktionen ein Array benötigen?

Ich bin neugierig und hoffentlich jemand kann etwas Licht auf diese - aber warum die C#-Funktionen, die "Params" nehmen müssen ein Array sein?

Ich verstehe, dass die Objekte in der Parameterliste in ein Array eingegeben werden, aber was ist, wenn jemand eine variadische Funktion erstellen möchte, die eine undefinierte Anzahl von Array-Objekten aufnimmt?

Nehmen Sie zum Beispiel diese Funktion...

private Int32 Sum(params Int32[] numbers)
{
    return numbers.Sum(); // Using LINQ here to sum
}

Ziemlich einfach, es kann eine unterschiedliche Anzahl von Zahlen aufgenommen werden - zum Beispiel...

Int32 x = Sum(1);
Int32 y = Sum(1, 2);
Int32 z = Sum(1, 2, 3);

Sagen wir nun, ich möchte eine Funktion erstellen, die eine unterschiedliche Anzahl von Integer-Arrays aufnimmt und alle Zahlen summiert. Soweit ich weiß, müsste ich Boxing berücksichtigen...

private Int32 SumArrays(params Object[] numbers)
{
    Int32 total = 0;
    foreach (Object o in numbers)
    {
        Int32[] array = (Int32[])o;

        total += array.Sum();
    }
    return total;
}

Die dann wie folgt verwendet werden könnten...

Int32[] arr1 = new Int32[] { 1, 2, 3 };
Int32[] arr2 = new Int32[] { 1, 2, 3, 4 };
Int32[] arr3 = new Int32[] { 1, 2, 3, 4, 5 };

Int32 x = SumArrays((Object)arr1, (Object)arr2);
Int32 y = SumArrays((Object)arr1, (Object)arr2, (Object)arr3);

Was war der Grund für diese Entscheidung? Warum wurde dies nicht einfach als eine einzelne Nicht-Array-Variable implementiert? Wie zum Beispiel params Int32 ?

3voto

Fredrik Mörk Punkte 151006

Die Funktionalität ist bereits vorhanden, es besteht keine Notwendigkeit, auf Boxen zurückzugreifen:

private int SumAll(params int[][] args)
{
    int result = 0;
    for (int x = 0; x < args.Length; x++)
    {
        for (int y = 0; y < args[x].Length; y++)
        {
            result += args[x][y];
        }
    }
    return result;
}

Sie müssen nur ein Array von Arrays hinzufügen.

0voto

Yuliy Punkte 16897

Die Parameter werden in einem einzigen Objekt zusammengefasst, und das niedrigste Objekt, das eine Sammlung enthalten kann, ist ein Array. Wenn Sie eine Funktion, die eine variable Anzahl von Arrays von ints nimmt, dann sollte es als ein Array von int Arrays deklariert werden.

static int SumArrays(params int[][] data)
{
    int rval = 0;
    for (int i = 0; i < data.Length; i++)
    {
        rval += data[i].Sum();
    }
    return rval;
}

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