Мне любопытно и, надеюсь, кто-то может пролить некоторое время на это, но почему функции C#, которые принимают «params», должны быть массивом?Каково было конструктивное решение для вариационных функций, требующих массива?
Получаем, что объекты в списке параметров вводятся в массив, но что, если кто-то хочет создать вариационную функцию, которая принимает неопределенное количество объектов массива?
Возьмите эту функцию, например ...
private Int32 Sum(params Int32[] numbers)
{
return numbers.Sum(); // Using LINQ here to sum
}
Довольно прямо вперед, он может принимать в разное количество номеров - например ...
Int32 x = Sum(1);
Int32 y = Sum(1, 2);
Int32 z = Sum(1, 2, 3);
Теперь давайте говорить, что я хочу для создания функции, которая принимает различное количество массивов Integer и суммирует все числа. Насколько я знаю, я должен был бы рассмотреть бокс ...
private Int32 SumArrays(params Object[] numbers)
{
Int32 total = 0;
foreach (Object o in numbers)
{
Int32[] array = (Int32[])o;
total += array.Sum();
}
return total;
}
которые затем могут быть использованы как ...
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);
Что было рассуждение за этим? Почему это никогда не было реализовано как одна переменная без массива? Например, params Int32
?
Ah cool не знал этого, но почему это так, потому что это не массив массивов? Это скорее всего список массивов, почему не просто параметры Int32 для списка чисел, а параметры Int32 [] для массива? – 2009-07-14 17:18:16
@Chalkey: да, это массив массивов. Если вы исследуете args в отладчике, он будет выглядеть так: args = {int [2] []}. Каждый элемент массива args является массивом int. –