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.