Desenvolvimento - C#
Trabalhando com Array Params no C#
Neste artigo apresento a utlilização de Arrays Params, importante recurso da linguagem C# e apresento os casos em que sua utilização é recomendada.
por Fabrício Lopes SanchezEste artigo tem como objetivo apresentar a passagem de arrays (também conhecidos como vetores) como parâmtros a métodos com exemplos práticos que mostrem sua real utilidade no contexto de desenvolvimento de aplicações.
Os arrays de parâmetros tem a funcionalidade de passar vários valores para um método de uma única vez e com a possibilidade destes parâmetros serem de tipos diferentes. Neste ponto você deve estar se perguntando: Ué, mas a sobreposição de métodos proporcionada pela orientação a objetos não possui a mesma funcionalidade?
O foco deste artigo não é cobrir a sobrecarga de métodos e operadores (este é um bom tema para outro artigo não acham?), entrentanto, o que podemos dizer em relação a sobrecarga de métodos é que ela não apresenta satisfatoriedade a todos os casos, sendo utilazada com eficiência para casos onde operações diferentes necessitam ser executadas baseadas em seus diferentes tipos de parâmetros. O problema desta abordagem surge quando não se sabe o número de parâmetros e os tipos de parâmetros que estarão chegando a determinado método. Neste caso, quantas implementações do mesmo método devem existir se o número de parâmetros é variável e indefinido?
Neste contexto é que os arrays de parêmetros são extremamente úteis. A seguir entenderemos como podemos trabalhar com este poderoso recurso na linguagem C#.
Entendendo as Limitações de um Array Tradicional como Parâmetro
Para entendermos o funcionamento dos arrays de parâmetros, imaginemos a seguinte situação: Quer-se determinar o menor valor em um intervalo de números inteiros de forma automática. Poderíamos então ter uma classe Uteis e um método encontraMenor para encontrar o menor número no intervalo, como apresenta a Listagem 1:
class Uteis
{
public static int encontraMenor(int[] valores)
{
if(valores.Length == 0)
{
throw new ArgumentException("Erro: Nenhum argumento passado!");
}
int corrente = valores[0];
foreach(int v in valores)
{
if(v < corrente)
{
corrente = v;
}
}
return corrente;
}
}
Listagem 1: Sugestão de implementação da classe Uteis e o método encontraMenor
Para utilizarmos o método encontraMenor bastaria reproduzir o procedimento descrito na Listagem 2, por exemplo:
//código anterior
//
//
int[] testeVlrs = new int[10];
testeVlrs = {1, 2, 54, 84, 31, 45, 0, 4, 3, 19};
int minimoEncontrado = Uteis.encontraMenor(testeVlrs);
//
//
//código posterior
Listagem 2: Exemplo de utilização do método encontraMenor
O códigoda Listagem 2é extremamente fácil de se entender. Criamos um array de inteiros chamado testeVlrs de dimensão 10, preenchemos este array com valores inteiros aleatórios e, em seguida, passamos este array como parâmetro para o método encontraMenor da classe Uteis. Sem segredo. O problema desta abordagem é que, para que o método funcione corretamente você precisa preencher o vetor antes de passá-lo como parâmetro, ou seja, tem-se um ciclo adicional de processamento. Para não esbarrarmos nesta limitação podemos utilizar os Params.
Declarando e Utilizando um Array Params
Para trabalharmos com array params utilizamos a palavra reservada params como um modificador do array. A Listagem 3 apresenta o mesmo método encontraMenor utilizando agora o modificador params:
class Uteis
{
public static int encontraMenor(params int[] valores)
{
if(valores.Length == 0)
{
throw new ArgumentException("Erro: Nenhum argumento passado!");
}
int corrente = valores[0];
foreach(int v in valores)
{
if(v < corrente)
{
corrente = v;
}
}
return corrente;
}
}
Listagem 3: Método encontraMenor com params array
Para utilizar o método bastaria fazer uma chamada direta, conforme apresenta a Listagem 4:
int minimoEncontrado = Uteis.encontraMenor(1, 2, 54, 84, 31, 45, 0, 4, 3, 19);
Listagem 4: Passando valores via params array
Ao olharmos a chamada do método encontraMenor, fica claro que, o array é preenchido em tempo de execução, portanto, bem mais produtivo e funcional, além de possibilitar a funcionalidade de encontrar o menor para qualquer número de elementos no array.
Algumas observações que devem ser levadas em conta quando pretende-se trabalhar com params:
- Não é possível utilizar a palavra chave params para arrays multidimensionais;
- Não é possível sobrecarregar um método apenas sobre a presença de params, pois, este não faz parte da assinatura do método;
- Não é possível utilizar os modificadores ref ou out para arrays com params;
- Um array params deve ser o último parâmtero;
- Um método não params tem prioridade sobre um método params, portanto, sobrecargas podem ser criadas conforme a necessidade;
Bom pessoal, é isso. Espero que este pequeno e direto artigo possa ter sido útil. Por favor, deixem seus comentários para que eu possa saber onde melhorar os textos.