Jaka jest różnica między tym a tworzeniem metody, która otrzymuje listę lub tablicę?
Różnica pomiędzy
void M(params int[] x)
i
void N(int[] x)
jest to, że M można nazwać tak:
M(1, 2, 3)
lub tak:
M(new int[] { 1, 2, 3 });
ale N można wywoływać tylko w drugi sposób, a nie w pierwszy sposób.
może ma to jakiś wpływ na wydajność?
Wpływ na wydajność jest taki, że niezależnie od tego, czy wywołujesz Mw pierwszy, czy w drugi sposób, tak czy inaczej, utworzysz tablicę. Utworzenie tablicy ma wpływ na wydajność, ponieważ zajmuje zarówno czas, jak i pamięć. Pamiętaj, że wpływ na wydajność należy mierzyć w stosunku do celów wydajności; jest mało prawdopodobne, aby koszt stworzenia dodatkowej tablicy był czynnikiem bramkowym, który jest różnicą między sukcesem a porażką na rynku.
Nie do końca rozumiem lub nie widzę, w jaki sposób wolisz ten z nieograniczonymi parametrami.
Jest to czysta i całkowicie wygoda dla autora kodu, który wywołuje metodę; jest po prostu krótszy i łatwiejszy do napisania
M(1, 2, 3);
zamiast pisać
M(new int[] { 1, 2, 3 });
Zapisuje tylko kilka naciśnięć klawiszy po stronie dzwoniącego. To wszystko.
Kilka pytań, które nie zadałeś, ale być może chciałbyś poznać odpowiedź na:
Jak nazywa się ta funkcja?
Metody pozwalające na przekazywanie zmiennej liczby argumentów po stronie wywołującej nazywane są variadic . Metody Params są sposobem, w jaki C # implementuje metody variadic.
Jak działa rozdzielczość przeciążenia w przypadku metody variadic?
W obliczu problemu rozwiązania problemu z przeciążeniem, C # rozważy zarówno formy „normalną”, jak i „rozwiniętą”, a forma „normalna” zawsze wygrywa, jeśli oba mają zastosowanie. Rozważmy na przykład:
void P(params object[] x){}
i mamy telefon
P(null);
Istnieją dwie możliwe możliwości. W „normalnej” formie wywołujemy Pi przekazujemy zerowe odwołanie do tablicy. W formie „rozszerzonej” dzwonimy P(new object[] { null }). W takim przypadku wygrywa normalna postać. Gdybyśmy mieli połączenie, P(null, null)wówczas normalna forma nie ma zastosowania, a forma rozszerzona wygrywa domyślnie.
Wyzwanie : załóżmy, że mamy var s = new[] { "hello" };telefon P(s);. Opisz, co dzieje się na stronie połączenia i dlaczego. Możesz być zaskoczony!
Wyzwanie : Załóżmy, że mamy jedno void P(object x){}i drugie void P(params object[] x){}. Co robi P(null)i dlaczego?
Wyzwanie : Załóżmy, że mamy jedno void M(string x){}i drugie void M(params string[] x){}. Co robi M(null)i dlaczego? Czym różni się to od poprzedniego przypadku?