qual é a diferença entre isso e apenas criar um método que recebe uma lista ou uma matriz?
A diferença entre
void M(params int[] x)
e
void N(int[] x)
é que M pode ser chamado assim:
M(1, 2, 3)
ou assim:
M(new int[] { 1, 2, 3 });
mas N só pode ser chamado da segunda maneira, não da primeira .
talvez tenha algum impacto no desempenho?
O impacto no desempenho é que, se você liga M
pela primeira ou pela segunda maneira, de qualquer maneira você cria uma matriz. A criação de uma matriz afeta o desempenho, pois leva tempo e memória. Lembre-se de que os impactos no desempenho devem ser medidos em relação às metas de desempenho; é improvável que o custo de criação de uma matriz extra seja o fator determinante que é a diferença entre sucesso e fracasso no mercado.
Não entendo completamente nem vejo de que maneira você preferiria aquele com parâmetros ilimitados.
É pura e inteiramente uma conveniência para o autor do código que está chamando o método; é simplesmente mais curto e fácil de escrever
M(1, 2, 3);
em vez de escrever
M(new int[] { 1, 2, 3 });
Apenas salva algumas teclas pressionadas no lado do chamador. Isso é tudo.
Algumas perguntas que você não fez, mas talvez queira saber a resposta para:
Como é chamado esse recurso?
Os métodos que permitem que um número variável de argumentos sejam passados no lado do chamador são chamados variadic . Os métodos de parâmetros são como o C # implementa métodos variados.
Como a resolução de sobrecarga funciona com um método variável?
Quando confrontado com um problema de resolução de sobrecarga, o C # considerará os formulários "normal" e "expandido", e o formulário "normal" sempre vence se ambos forem aplicáveis. Por exemplo, considere isso:
void P(params object[] x){}
e nós temos uma ligação
P(null);
Existem duas possibilidades aplicáveis. No formato "normal", chamamos P
e passamos uma referência nula para a matriz. Na forma "expandida", chamamos P(new object[] { null })
. Nesse caso, a forma normal vence. Se recebemos uma chamada P(null, null)
, o formulário normal é inaplicável e o formulário expandido vence por padrão.
Desafio : suponha que tenhamos var s = new[] { "hello" };
uma ligação P(s);
. Descreva o que acontece no site da chamada e por quê. Você pode se surpreender!
Desafio : Suponha que temos ambos void P(object x){}
e void P(params object[] x){}
. O que P(null)
faz e por quê?
Desafio : Suponha que temos ambos void M(string x){}
e void M(params string[] x){}
. O que M(null)
faz e por quê? Como isso difere do caso anterior?