Retornando vários valores

Olá pessoal, meu nome é Mauricio Junior e hoje eu vou falar um pouco sobre vários retornos de uma função ou método usando a linguagem C# criada pela Microsoft e com o Visual Studio 2019.

Existe um nome pra isso, especialistas dão o nome de Tupla, mas você pode fazer de várias maneiras um retorno diferenciado; como por exemplo: ao invés de ser um retorno com vários parâmetros, você pode preencher os atributos de uma classe para retornar. Isso depende muito do que deseja e de como coloca o padrão em seus projetos ou empresa. Cada uma pode trabalhar da maneira que melhor achar, só procure se adaptar da melhor maneira possível.

Geralmente eu prefiro preencher a propriedade de uma classe ao invés de criar um método com vários retornos, até porque se algum parâmetro for acrescentado, não dará tanto trabalho para fazer a alteração.

Vou criar um projeto simples em C#, do tipo console com apenas dois métodos, um principal e outro que recebe alguns valores e gera um retorno.

Código

O código 1.1 mostra o método principal chamado Main e dentro dele existe outro método chamado GetValues onde receber um monte de parâmetros. O retorno dele está atribuído a uma variável chamada result e dentro dessa variável existem vários ítens que podem ser pegos como o .item1, .item2 e assim por diante. Esses valores podem ser impressos na tela sem qualquer problema.

Código 1.1 - Método principal

    static void Main(string[] args)
    {
        try
        {
            var result = GetValues("Mauricio", 36, Convert.ToDateTime("1983-09-29"));

            Console.WriteLine(result.Item1);

            Console.WriteLine(result.Item2);

            Console.WriteLine(result.Item3);

            Console.Read();
        }
        catch (Exception ex)
        {
            Console.Write(ex.StackTrace.ToString());

            Console.Read();
        }
    }

O código 1.2 já mostra o método chamado GetValues que recebe os parâmetros vistos anteriormente e retorna string, int, DateTime, DayOfWeek e int. O método é simples mas você precisa prestar atenção no retorno que está entre parênteses. Então a regra principal aqui é que o retorno tem que necessariamente estar entre parênteses. Note que o retorno também precisa estar entre parênteses.

Código 1.2 - Método com vários retornos

    static (string, int, DateTime, DayOfWeek, int) GetValues(string name, int age, DateTime birstday)
    {
        var diaDaSemana = birstday.DayOfWeek;

        var diaDoAno = birstday.DayOfYear;

        return (name, age, birstday, diaDaSemana, diaDoAno);
    }

Vamos alterar um pouco o método principal, ou seja, o código 1.1. Isso porque podem existir variáveis que você não precisa receber todos e alguns você precisa descartar. Para isso, existe o underline que serve para descartar os valores que não serão utilizados, veja o código 1.3.

Código 1.3 - Descarte de valores

    static void Main(string[] args)
    {
        try
        {
            (_, _, _, _, _) = GetValues("Mauricio", 37, Convert.ToDateTime("1983-09-29"));

            Console.Read();
        }
        catch (Exception ex)
        {
            Console.Write(ex.StackTrace.ToString());

            Console.Read();
        }
    }

Veja que antes da chamada do método, existe um parênteses com um monte de underline e vírgulas. Isso quer dizer que todos os valores de retorno do método serão descartos. No caso de querer pegar apenas um valor específico, basta atribuir um nome de variável, por exemplo: eu quero pegar apenas o dia da semana que eu nasci.

Para pegar o dia da semana que eu nasci, é necessário olhar qual é a posição do retorno que nesse caso é o quarto parâmetro, colocar um nome e depois buscar o valor. Note que eu tive que colocar um var antes dos valores. Veja o código 1.4.

Código 1.4 - Pegar apenas um valor do retorno

    static void Main(string[] args)
    {
        try
        {
            var (_, _, _, diaDaSemana, _) = GetValues("Mauricio", 37, Convert.ToDateTime("1983-09-29"));

            Console.WriteLine(diaDaSemana);

            Console.Read();
        }
        catch (Exception ex)
        {
            Console.Write(ex.StackTrace.ToString());

            Console.Read();
        }
    }

O DateTime é uma classe que ao passar uma data e um ano qualquer ele pode te dizer qual é o dia da semana que deu naquele dia específico. Existe também a possibilidade de pegar o dia do ano se você for contar os dias. Ele pode fazer além disso, mas aqui não é o objetivo do artigo falar sobre o DateTime.

O resultado desse método foi esse, na figura 1.1.

Figura 1.1 - Retorno com o dia da semana.

Image

Veja o vídeo abaixo mostrando como fazer todo o exemplo e com mais informações.


Autor: Mauricio Junior
Revista ecode10 Magazine