Czy istnieje alternatywa C # dla parametrów vararg Javy?


93

Pracowałem nad Javą i nowością w technologii .Net

Czy można zadeklarować w C # funkcję, która akceptuje zmienne parametry wejściowe

Czy istnieje składnia języka C # podobna do następującej składni języka Java?

void f1(String... a)

2
Jeśli którakolwiek z poniższych odpowiedzi odpowiedziała na Twoje pytanie, czyli sposób, w jaki działa Stack Overflow, „zaakceptowałbyś” odpowiedź, klikając znacznik wyboru obok niej; szczegóły tutaj .
TJ Crowder

Odpowiedzi:


150

Tak, C # ma odpowiednik parametrów varargs. Nazywa się je tablicami parametrów i wprowadza paramsmodyfikator:

public void Foo(int x, params string[] values)

Następnie zadzwoń za pomocą:

Foo(10, "hello", "there");

Podobnie jak w przypadku Javy, jest to tylko ostatni parametr, który może się tak zmieniać. Zauważ, że (podobnie jak w Javie) parametr of params object[] objectsmoże łatwo spowodować zamieszanie, ponieważ musisz pamiętać, czy pojedynczy argument typu object[]ma być ponownie opakowany, czy nie. Podobnie w przypadku każdego typu dopuszczającego wartość null, należy pamiętać, czy pojedynczy argument nullbędzie traktowany jako odwołanie do tablicy, czy jako pojedynczy element tablicy. (Myślę, że kompilator tworzy tablicę tylko wtedy, gdy jest to konieczne, ale mam tendencję do pisania kodu, dzięki czemu nie muszę o tym pamiętać).


+1, chociaż wspomniałbym o tym (podobnie jak w przypadku prawie każdej innej funkcji językowej), nie należy tego nadużywać.
Federico Berasategui

16
@HighCore: Jeśli zamierzasz wspomnieć o prawie każdej innej funkcji językowej, prawdopodobnie nie warto o tym wspominać :)
Jon Skeet

2
@hvd: Biorąc pod uwagę, że OP wydaje się być początkującym, wolałbym nie wchodzić tutaj w nazwane argumenty, opcjonalne parametry itp. Rozumiem, o co mi chodzi, ale myślę, że w tej chwili wprowadziłoby to więcej zamieszania niż światła.
Jon Skeet,

37

Spójrz na parametry (odwołanie w C #)

Słowo kluczowe params pozwala określić parametr metody, który przyjmuje zmienną liczbę argumentów.

Możesz wysłać rozdzieloną przecinkami listę argumentów typu określonego w deklaracji parametru lub tablicę argumentów określonego typu. Nie możesz też wysyłać żadnych argumentów.

Żadne dodatkowe parametry nie są dozwolone po słowie kluczowym params w deklaracji metody, aw deklaracji metody dozwolone jest tylko jedno słowo kluczowe params.

Jak pokazano w przykładzie, metoda jest zadeklarowana jako

public static void UseParams(params int[] list)
{
    for (int i = 0; i < list.Length; i++)
    {
        Console.Write(list[i] + " ");
    }
    Console.WriteLine();
}

i używany jako

UseParams(1, 2, 3, 4);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.