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!