2012-01-03 2 views
12

Я помню, что у меня где-то красное, что вы можете создать метод, который принимает бесконечные аргументы. Проблема в том, что я не помню, как это сделать. Я помню, что это было что-то вроде этого:Бесконечные аргументы метода того же типа

private void method(int arguments...) 
{ 
//method body 
} 

Я уверен, что там был «...». И я помню, что когда вы звоните method, вы можете назвать это следующим образом: method(3232); или method(123,23,12); Если кто-то понимает, о чем я говорю, скажите, пожалуйста, как это сделать.

ответ

42

Вы бы использовать params ключевое слово:

private void method(params int[] arguments) 
{ 
    //method body 
} 

Вы можете вызвать свой метод следующим образом: method(1,2,3,4,5,6,7,8,9); и массив будет содержать эти числа. Ключевое слово params должно быть в массиве, и если это не единственный параметр в методе, он должен быть последним. Только один параметр может иметь объявление параметра.

+0

Хорошо, но почему я помню использование ...? – Bosak

+8

@Bosak: Вот как это делается на Java (хотя '...' появляется после имени типа). –

+0

О, возможно, вы правы. Я не знаю Java, но однажды я смотрел клип о чем-то на Java, и поскольку он очень похож на C#, я смутил его. – Bosak

3

вы имеете в виду ParamArray ? (для vb.net)

для C#, казалось, что это params

+3

Это VB; вопрос помечен C#. – phoog

+0

@phoog, замечено и добавлено для C# – Fredou

1

Вы ищете определение бесконечного числа аргументов c/C++ для функции. Вы можете увидеть здесь - http://www.cplusplus.com/reference/cstdarg/va_start/

простой способ реализовать такую ​​функцию, как то:

1- определить свою функцию, например

void logging(const char *_string, int numArgs, ...) 

Первый аргумент является строка, которую вы хотите использовать ,

Второй аргумент - это количество бесконечных аргументов, которые вы хотите дать. Вам не нужно использовать этот параметр, если вы хотите подсчитать заполнители в коммутаторе (например,% d,% f в printf) -Hint: в цикле получить каждый символ и посмотреть, является ли он вашим заполнителем.

Я хочу дать первый пример того, как вы могли бы назвать такую ​​функцию:

logging("Hello %0. %1 %2 %3", "world", "nice", "to", "meet you"); // infinite arguments are "world", "nice", ... you can give as much as you want 

Как вы видите, мои заполнители номер. Вы можете использовать все, что хотите.

2- Есть макросы, которые инициализирует список переменных и получает значение аргумента:

va_list arguments; // define the list 
va_start(arguments, numArgs); // initialize it, Note: second argument is the last parameter in function, here numArgs 

for (int x = 0; x < numArgs; x++) // in a loop 
{ 
     // Note : va_arg(..) gets an element from the stack once, dont call it twice, or else you will get the next argument-value from the stack 
     char *msg = va_arg(arguments, char *); // get "infinite argument"-value Note: Second parameter is the type of the "infinite argument". 
     ... // Now you can do whatever you want - for example : search "%0" in the string and replace with msg 
} 
va_end (arguments); // we must end the listing 

Если заменить каждую пустышку с бесконечными значениями аргумента и напечатать новую строку, вы должны увидеть это :

Hello world. приятно встретиться с вами

Я надеюсь, что помогает ...

+1

[Пожалуйста, укажите больше, чем ссылку в качестве ответа) (https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers) – ThreeFx