No artigo de hoje vou mostrar duas formas diferentes de retornar mais de um valor de um métodoutilizando C#.
São duas formas distintas, que também podem ter aplicações distintas. Cabe ao leitor avaliar o contexto e escolher a melhor aplicação.
Também vou mostrar como passar vários valores para um método através de um único parâmetro.
O objetivo do primeiro modelo é fazer um método retornar dois valores (int e string) utilizando out (ByRef no Visual Basic).
Você pode criar um método onde os parâmetros são precedidos da palavra reservada out.
Este método pode ser void (exemplo 1), mas também pode ter um retorno (exemplo 2).
protected void Page_Load(object sender, EventArgs e)
{
int idade;
string nome;
//chamar o método que calculará a idade, atribuirá o nome e a idade passados com out.
//Método com um valor de entrada (DateTime) e dois de saída (int e string)
getNomeIdade(new DateTime(2010, 12, 01), out idade, out nome);
Response.Write("idade:" + idade + " nome:" + nome);
}
public void getNomeIdade(DateTime nascimento, out int idade, out string nome)
{
//Calcular idade
TimeSpan ts = DateTime.Today - nascimento;
DateTime dtIdade = (new DateTime() + ts).AddYears(-1).AddDays(-1);
//Atribuir a idade à variável
idade = dtIdade.Year;
//Atribuir o nome à variável
nome = "Codebreak";
}
Resultado:
idade:2 nome:Codebreak
Este segundo exemplo é um método que retorna um int da forma tradicional e o nome através do out.
protected void Page_Load(object sender, EventArgs e)
{
int idade;
string nome = "Codebreak";
//chamar o método que calculará a idade, atribuirá o nome (passado com out) e retornará o int.
//Método com um valor de entrada (DateTime), um de saída (string) e um de retorno (int)
idade = getNomeIdade(new DateTime(2010, 12, 01), out nome);
Response.Write("idade:" + idade + " nome:" + nome);
}
public int getNomeIdade(DateTime nascimento, out string nome)
{
//Atribuir null à variável
nome = null;
//Calcular idade
TimeSpan ts = DateTime.Today - nascimento;
DateTime dtIdade = (new DateTime() + ts).AddYears(-1).AddDays(-1);
//Retornar idade
return dtIdade.Year;
}
Resultado:
idade:2 nome:
Os dois exemplos acima você será obrigado a atribuir um valor de retorno para todos os parâmetros que contiverem o out.
Agora vou mostrar um terceiro exemplo, que utiliza o Tuple para retornar vários valores de um método em C#.
Um Tuple pode conter muitos itens e cada item pode ser de qualquer tipo (int, string, double...). Mas depois de criar um Tuple, você não pode alterar seus valores.
protected void Page_Load(object sender, EventArgs e)
{
//chamar o método que calculará a idade, retornará int e string.
//Método com um valor de entrada (DateTime), e dois de saída (Tuple<int, string>)
var retorno = getNomeIdade(new DateTime(2010, 12, 01));
Response.Write("idade:" + retorno.Item1 + " nome:" + retorno.Item2);
}
public Tuple<int, string> getNomeIdade(DateTime nascimento)
{
//Calcular idade
TimeSpan ts = DateTime.Today - nascimento;
DateTime dtIdade = (new DateTime() + ts).AddYears(-1).AddDays(-1);
//Retornar Idade e Nome utilizando Tuple
return new Tuple<int, string>(dtIdade.Year, "Codebreak");
}
Resultado:
idade:2 nome:Codebreak
Neste último exemplo vou mostrar como passar vários valores para um método através de um único parâmetro.
protected void Page_Load(object sender, EventArgs e)
{
//Criar um novo Tuple com vários elementos para ser passado como parâmetro.
var parameters = new Tuple<int, int, int, int, string>(1, 3, 6, 10, "Codebreak");
//chamar o método que retornará a soma dos iteiros e o nome passado.
var retorno = getNomeIdade(parameters);
Response.Write("idade:" + retorno.Item1 + " nome:" + retorno.Item2);
}
public Tuple<int, string> getNomeIdade(Tuple<int, int, int, int, string> parameters)
{
//Somar os primeiros 4 parâmetros
int idade = parameters.Item1 + parameters.Item2 + parameters.Item3 + parameters.Item4;
//Retornar a soma da idade e Nome utilizando Tuple
return new Tuple<int, string>(idade, parameters.Item5);
}
Resultado:
idade:20 nome:Codebreak