Создание методов с бесконечными параметрами?

В С# вы можете сделать это:

foo = string.Format("{0} {1} {2} {3} ...", "aa", "bb", "cc" ...);

Этот метод Format() принимает бесконечные параметры, первый из которых должен форматировать строку, а остальные — это значения, которые должны быть помещены в строку.

Сегодня я столкнулся с ситуацией, когда мне нужно было получить набор строк и протестировать их, тогда я вспомнил об этой языковой функциональности, но понятия не имел. После нескольких безуспешных поисков в Интернете я понял, что было бы разумнее просто получить массив, что меня не вполне удовлетворило.

Вопрос. Как создать функцию, которая принимает бесконечные параметры? И как мне его использовать?


person Marcelo    schedule 12.03.2010    source источник
comment
бесконечно... это много параметров. Вы пробовали это?   -  person flq    schedule 12.03.2010
comment
Педант, он ни в коем случае не бесконечен; но любой нормальный код должен быть в порядке.   -  person Marc Gravell    schedule 12.03.2010
comment
Я был бы удивлен, если бы у кого-то была бесконечная память. Я хочу немного!   -  person Callum Rogers    schedule 13.03.2010
comment
Придирки, но вы можете изменить заголовок вопроса, так как это не имеет отношения к перегрузкам, а скорее к количеству параметров.   -  person Christian.K    schedule 13.03.2010
comment
@Christian.K Я думаю, что это более проясняет, поскольку это был мой первоначальный вопрос, и его было бы легче связать с аналогичными сомнениями, которые могут возникнуть у других. И (в общем случае) это виртуальный способ создания перегрузок (если вы укажете одну из них неправильно, Visual Studio жалуется, говоря, что ни одна из перегрузок не принимает эти параметры или что-то в этом роде)   -  person Marcelo    schedule 14.03.2010
comment
@MarceloRamires: я пытался сослаться на тот факт, что ключевое слово params, о котором идет речь в приведенном вами примере, имеет столько же общего с перегрузками, сколько и любой другой список параметров метода, а скорее позволяет методу вызываться с массивом бесконечных элементов. А если серьезно, это ваш вопрос, так что, во что бы то ни стало, оставьте его таким, если в заголовке говорится о том, что вы намеревались узнать/спросить (возможно, тогда я неправильно понял, достаточно честно :-)   -  person Christian.K    schedule 14.03.2010
comment
@Christian.K ха-ха .. Извините, если это прозвучало глупо, на самом деле я знал, что мне не придется делать перегрузки с самого начала, просто когда вы работаете с методом, который использует его, не зная параметров, в конечном итоге вы представляете себе бесконечный класс с тысячами перегрузок, хотя на самом деле я знал, что для этого будет аккуратная простая ключевая работа. Благодарим Вас за разъяснения! знак равно   -  person Marcelo    schedule 14.03.2010


Ответы (7)


С помощью ключевого слова params.

Вот пример:

    public int SumThemAll(params int[] numbers)
    {
        return numbers.Sum();
    }

    public void SumThemAllAndPrintInString(string s, params int[] numbers)
    {
        Console.WriteLine(string.Format(s, SumThemAll(numbers)));
    }

    public void MyFunction()
    {
        int result = SumThemAll(2, 3, 4, 42);
        SumThemAllAndPrintInString("The result is: {0}", 1, 2, 3);
    }

Код показывает разные вещи. Во-первых, аргумент с ключевым словом params всегда должен быть последним (и он может быть только один для каждой функции). Кроме того, вы можете вызвать функцию, которая принимает аргумент params, двумя способами. Первый способ показан в первой строке MyFunction, где каждое число добавляется как отдельный аргумент. Однако его также можно вызвать с помощью массива, как показано в SumThemAllAndPrintInString, где вызывается SumThemAll с int[], называемым numbers.

person Klaus Byskov Pedersen    schedule 12.03.2010
comment
@MarceloRamires: Нажмите на ссылку. В любом случае, я не могу объяснить это лучше, чем документация ;-) - person Klaus Byskov Pedersen; 12.03.2010
comment
На самом деле вы можете; это объяснение состоит всего из 2 строк плюс пример. Не говорю, что документация недостаточно хороша, просто говорю, что вы могли бы объяснить ее лучше, если бы захотели. - person Thomas Bonini; 13.03.2010
comment
@MarceloRamires: string.Format("{0} {1} {2} {3}", "aa", "bb", "cc") выглядит как Format(params object[] args), где args = {aa, bb, cc}. Есть смысл? - person Pat; 13.03.2010
comment
@MarceloRamires Я уточнил. Надеюсь, это имеет смысл. - person Klaus Byskov Pedersen; 25.03.2010
comment
Было бы то же самое, если бы вы удалили string.Format, чтобы он стал Console.WriteLine(s, SumThemAll(numbers))? - person ; 13.04.2016

Используйте ключевое слово params. Применение:

public void DoSomething(int someValue, params string[] values)
{
    foreach (string value in values)
        Console.WriteLine(value);
}

Параметр, который использует ключевое слово params, всегда идет в конце.

person David Morton    schedule 12.03.2010
comment
И бесконечные значения должны быть в конце, верно? если бы я хотел, чтобы вместе с ним было одно целое число, оно ДОЛЖНО быть в начале, верно? - person Marcelo; 12.03.2010
comment
@MarceloRamires - Правильно, это должно быть в конце. - person Nick Craver; 12.03.2010
comment
@MarceloRamiers - ваш метод будет выглядеть как public void DoSomething(int myvalue, params string[] values) - person David Basarab; 12.03.2010

Несколько заметок.

Параметры должны быть помечены для типа массива, например string[] или object[].

Параметр, помеченный w/params, должен быть последним аргументом вашего метода. Foo(string input1, object[] items) например.

person bakasan    schedule 12.03.2010

используйте ключевое слово params. Например

static void Main(params string[] args)
{
    foreach (string arg in args)
    {
        Console.WriteLine(arg);
    }
}
person Russ Cam    schedule 12.03.2010
comment
Спасибо, но... и как мне его использовать? - person Marcelo; 12.03.2010

Этого можно добиться с помощью ключевого слова params. .

Маленький пример:

public void AddItems(params string[] items)
{
     foreach (string item in items)
     { 
         // Do Your Magic
     }
}
person Faizan S.    schedule 12.03.2010

 public string Format(params string[] value)
 {
            // implementation
 }

Ключевое слово params используется

person Dan    schedule 12.03.2010

function void MyFunction(string format, params object[] parameters) {

}

Вместо object[] вы можете использовать любой тип, который вам нравится. Аргумент params всегда должен быть последним в строке.

person AxelEckenberger    schedule 12.03.2010