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 Sanchez



Este 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.

Fabrício Lopes Sanchez

Fabrício Lopes Sanchez - Possui graduação em Ciência da Computação pela UNORP - Centro Universitário do Norte Paulista (2005). Obteve título de mestre junto a USP (Universidade de São Paulo) no Programa Interunidades Bioengenharia campus São Carlos. Atualmente é aluno de doutorado e pesquisador na mesma instituição e departamento. É membro regular do SpeechLab (Laboratório de Processamento de Áudio e Voz) localizado no Instituto de Física de São Carlos. Atua na área de processamento digital de áudio e voz, especialmente baseado em wavelets aplicadas à inserção e extração de watermarks em sinais de áudio e fala, análise cepstral de sinais de fala e desenvolvimento de ferramentas computacionais aplicadas ao processamento digital de sinais. Atua como desenvolvedor web na União Central Brasileira da IASD com C# e ASP.NET desde 2007. É fundador e administrador da comunidade .NET Interior.