2012-01-03 21 views
12

Pamiętam, że mam gdzieś czerwony, że można stworzyć metodę, która przyjmuje niekończące się argumenty. Problem polega na tym, że nie pamiętam, jak to zrobić. Pamiętam, że to było coś takiego:Niekończące się argumenty metody tego samego typu.

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

Jestem pewien, że nie było „...”. Pamiętam, że gdy zadzwonisz pod numer method, możesz to tak nazwać: method(3232); lub method(123,23,12); Jeśli ktokolwiek zrozumie, o czym mówię, powiedz mi, jak to zrobić.

Odpowiedz

42

byłoby użyć params kluczowe:

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

Można wywołać metodę tak: method(1,2,3,4,5,6,7,8,9); a tablica zawiera te liczby. Słowo kluczowe params musi znajdować się w tablicy, a jeśli nie jest jedynym parametrem w metodzie, musi być ostatnim. Tylko jeden parametr może mieć deklarację parametru.

+0

OK, ale dlaczego pamiętam użycie ...? – Bosak

+8

@Bosak: Tak to się robi w Javie (chociaż "..." pojawia się po nazwie typu). –

+0

Och, może masz rację. Nie znam Javy, ale kiedyś obejrzałem klip o czymś w Javie i ponieważ jest to bardzo podobne do C#, pomyliłem to. – Bosak

1

Szukasz definicji c/C++ o nieskończonej liczbie argumentów funkcji. można zobaczyć tutaj - http://www.cplusplus.com/reference/cstdarg/va_start/

Łatwym sposobem realizacji takiej funkcji jest tak:

1- zdefiniować swoją funkcję na przykład

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

Pierwszym argumentem jest ciąg chcesz użyć .

Drugi argument to liczba nieskończonych argumentów, które chcesz podać. Nie musisz używać tego parametru, jeśli chcesz policzyć symbole zastępcze w przełączniku (np.% D,% f w printf) -Uwaga: w pętli uzyskaj wszystkie znaki i sprawdź, czy to twój symbol zastępczy-.

chcę dać pierwszy przykład jak można nazwać taką funkcję:

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

Jak widać moje zastępcze są liczbami. Możesz użyć czegokolwiek, co chcesz.

2- Istnieją makra, które inicjuje zmienną listy i pobiera wartość argumentu:

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 

Jeśli zastąpi każdy zastępczy z nieskończonych wartości argumentów i wydrukować nowy ciąg, powinieneś zobaczyć :

Witaj, świecie. Miło cię poznać

Mam nadzieję, że pomaga ...

+1

[Podaj więcej niż link jako odpowiedź] (https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers) – ThreeFx

Powiązane problemy