qual è la differenza tra questo e la semplice creazione di un metodo che riceve un elenco o un array?
La differenza tra
void M(params int[] x)
e
void N(int[] x)
è che M può essere chiamato così:
M(1, 2, 3)
o in questo modo:
M(new int[] { 1, 2, 3 });
ma N può essere chiamato solo nel secondo modo, non nel primo modo.
forse ha qualche impatto sulle prestazioni?
L'impatto sulle prestazioni è che, indipendentemente dal fatto che si chiami M
nel primo o nel secondo modo, viene creato un array. La creazione di un array ha un impatto sulle prestazioni perché richiede tempo e memoria. Ricordare che gli impatti sulle prestazioni devono essere misurati rispetto agli obiettivi di prestazione; è improbabile che il costo di creazione di un array aggiuntivo sia il fattore di gating che è la differenza tra successo e fallimento nel mercato.
Non capisco perfettamente o vedo in che modo preferiresti quello con parametri illimitati.
È puramente e interamente una comodità per l'autore del codice che chiama il metodo; è semplicemente più breve e più facile da scrivere
M(1, 2, 3);
invece di scrivere
M(new int[] { 1, 2, 3 });
Salva solo alcune sequenze di tasti dal lato del chiamante. Questo è tutto.
Alcune domande che non hai posto ma che vorresti conoscere la risposta a:
Come si chiama questa funzione?
I metodi che consentono il passaggio di un numero variabile di argomenti sul lato chiamante sono chiamati variadic . I metodi di Params sono il modo in cui C # implementa i metodi variadici.
Come funziona la risoluzione del sovraccarico con un metodo variadico?
Di fronte a un problema di risoluzione del sovraccarico, C # prenderà in considerazione sia la forma "normale" che "espansa" e la forma "normale" vince sempre se entrambe sono applicabili. Ad esempio, considera questo:
void P(params object[] x){}
e abbiamo una chiamata
P(null);
Vi sono due possibilità applicabili. In forma "normale", chiamiamo P
e passiamo un riferimento null per l'array. In forma "espansa", chiamiamo P(new object[] { null })
. In questo caso, vince la forma normale. Se abbiamo ricevuto una chiamata, P(null, null)
il modulo normale è inapplicabile e il modulo espanso vince per impostazione predefinita.
Sfida : supponiamo di avere var s = new[] { "hello" };
e una chiamata P(s);
. Descrivi cosa succede sul sito della chiamata e perché. Potresti essere sorpreso!
Sfida : supponiamo di avere entrambi void P(object x){}
e void P(params object[] x){}
. Cosa fa P(null)
e perché?
Sfida : supponiamo di avere entrambi void M(string x){}
e void M(params string[] x){}
. Cosa fa M(null)
e perché? In cosa differisce dal caso precedente?