Métodos com um número variável de parâmetros

Saudações. Se você, como eu, mora na região sul do Brasil, deve estar congelado ou em processo de congelamento, para aproveitar este tempo e a pausa entre um e outro artigo resolvi escrever sobre um assunto que vai ajudar muito programador C# que está começando a se aventurar por esta linguagem.

O recurso em questão é o uso de um número variável de argumentos (ou parâmetros) em uma assinatura de um método.

Pense na seguinte situação: você tem um método e que pode receber zero ou “n” argumentos que podem ser do mesmo tipo ou não. Ou ainda, você tem um método em que é necessário ter pelo menos um argumento e os demais opcionais.

A solução mais rápida para isso é usar a palavra chave “params” ao lado do argumento que se deseja deixar opcional e com um número variado de elementos.

Deve ser declarado no método da seguinte forma:

<tipo do retorno> <NomeDoMétodo>(params <tipo do parametro>[] <nome do parâmetro>)

Um exemplo do uso pode ser conferido abaixo, em um programa que invoca um método de uma classe que pode receber um número variável de argumentos.

using System;

void Main()
{
new anyClass().doSomething("Um parâmetro", "Dois parâmetros");
}

// Define other methods and classes here
public class anyClass
{
public void doSomething(String par, params object[] anyParams)
{
Console.WriteLine("O primeiro parâmetro foi[{0}]", par);

if(anyParams.Length == 0)
{
Console.WriteLine("Nenhum parâmetro acessório foi enviado.");
}
else
{
Console.WriteLine("Foram informados [{0}] parâmetros adicionais.", anyParams.Length);
}
}
}



Como pode ser percebido, para obter o tamanho da lista passada nos argumentos, basta inspecionar o conteúdo da propriedade “Length”. No exemplo foi usado o tipo “object”, mas, querendo implementar boas práticas e evitar o “unboxing” basta rescrever o código do método para utilizar “Generics”.




public void doSomething<T>(String par, params T[] anyParams)
{
Console.WriteLine("O primeiro parâmetro foi[{0}]", par);

if(anyParams.Length == 0)
{
Console.WriteLine("Nenhum parâmetro acessório foi enviado.");
}
else
{
Console.WriteLine("Foram informados [{0}] parâmetros adicionais.", anyParams.Length);
Console.WriteLine("O tipo usado no parâmetro foi [{0}]", typeof(T));
}
}





Este código produz a seguinte saída na tela:





O primeiro parâmetro foi[Um parâmetro]
Foram informados [1] parâmetros adicionais.
O tipo usado no parâmetro foi [System.String]
 
 


Por hoje é isso. Happy code!