C# - Retornando múltiplos valores de um método - I


Neste artigo veremos como retornar mais de um item de um método usando C#.

Os métodos na linguagem C# retornam somente um único valor que pode ser um objeto com múltiplos campos.

Em muitas situações retornar apenas um único valor a partir de um método não é suficiente para atender a sua necessidade. Nesses casos você precisa uma forma de retornar mais de um item.

Você pode conseguir isso usando a palavra-chave out que irá atuar como parâmetro de retorno ou pode retonar uma instância do tipo contendo os valores desejados.

Existem duas maneiras de retornar mais de um valores usando parâmetros out.

  1. Podemos usar parâmetros formais modificados pela palavra-chave out.
  2. Podemos alocar uma instância de KeyValuepair para armazenar os valores dos resultados. (Podemos também usar um Tuple ou ValueTuple)

Podemos também usar a palavra-chave ref para obter mais de um valor no retorno de um método. Lembrando que  ref indica um valor que é passado por referência.

Vejamos agora como isso funciona na prática.

recursos usados:

  • Visual Studio 2017 Community

Criando o projeto Console

Crie um projeto do tipo Console App(.NET Framework) com o nome RetornaMultiplosValores.

Para cada um dos exemplos você pode incluir um novo projeto usando a opção File-> Add New Project;

1- Usando a palavra-chave out

No primeiro exemplo vamos usar o parâmetro out para retonar o resto da divisão entre dois números inteiros.

Inclua o código abaixo no arquivo Program.cs :

using System;

namespace RetornaMultiploValores
{
    class Program
    {
        static void Main(string[] args)
        {
            int resto ;
            int resultado = GetResultadoDaDivisao(10, 3, out resto);
            Console.WriteLine($" 10 / 3  = { resultado } resto { resto}");
            Console.ReadLine();
        }

        static int GetResultadoDaDivisao(int dividendo, int divisor, out int resto)
        {
            int quociente = dividendo / divisor;
            resto = dividendo % divisor;
            return quociente;
        }
    }
}

Executando o projeto teremos o resultado a seguir:

Essa é a abordagem clássica e tradicional para obter mais de um valor a partir de um método: passamos um parâmetro resto usando out.

2- Usando a palavra-chave ref

Neste exemplo vamos retornar dois valores : soma e multiplicacao de um método que calcula a soma e a multiplicação de dois números.

Inclua o código abaixo no arquivo Program.cs:

using System;
namespace Usando_Ref
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            int b = 20;
            int soma = 0;
            int multiplicacao=0;
            Calcula(a, b, ref soma, ref multiplicacao);
            Console.WriteLine($" 10 + 20 = {soma}  e   10 x 20 = {multiplicacao} ");
            Console.ReadLine();
        }
        static void Calcula(int a, int b, ref int soma, ref int multiplicacao)
        {
            soma = a + b;
            multiplicacao = a * b;
        }
    }
}

Executando este código teremos o resultado abaixo:

Neste exemplo obtemos os dois valores calculados no método Calcula passando os parâmetros adicao e multiplicacao usando a palavra-chave ref.

3- Usando uma classe

Em outra abordagem clássica podemos obter mais de um valor de um retorno de método definindo uma classe e retornado um objeto desta classe.

No exemplo criamos a classe Resultado com os campos soma e multiplicacao e no método Calcula, criamos uma instância dessa classe e atribuimos os resultados aos campos da classe.

Como a classe Calcula retorna um tipo Resultado, para obter os valores retornados basta acessar a instância do objeto retornado pela classe Calcula.

Inclua o código abaixo no arquivo Program.cs:

using System;
namespace Usando_Classe
{
    class Resultado
    {
        public int soma;
        public int multiplicacao;
    }
    class Program
    {
        static void Main(string[] args)
        {
            int a = 20;
            int b = 30;
            var resultado = Calcula(a, b);
            Console.WriteLine($" 20 + 30 = {resultado.soma}  e   20 x 30 = {resultado.multiplicacao} ");
            Console.ReadLine();
        }
        private static Resultado Calcula(int a, int b)
        {
            var resultado = new Resultado
            {
                soma = a + b,
                multiplicacao = a * b
            };
            return resultado;
        }
    }
}

Abaixo vemos o resultado da execução do código:

Da mesma forma que usamos uma classe podemos usar uma Struct também. Neste caso basta definir uma Struct Resultado conforme o código a seguir:

    struct Resultado
    {
        public int soma;
        public int multiplicacao;
    }

O resto do código é exatamente igual ao anterior.

Na próxima parte do artigo veremos como obter mais de um valor de um método usando Tuplas e o novo recurso do C# 7.0.

Pegue o projeto completo aqui :    RetornaMultiploValores.zip

Ó Senhor, Senhor nosso, quão admirável é o teu nome em toda a terra, pois puseste a tua glória sobre os céus!
Salmos 8:1

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Referências:


José Carlos Macoratti