C# - Usando parâmetros de saída (Output)


  Hoje veremos o conceito de parâmetros de saída (out) na linguagem C#.

Às vezes, os métodos devem retornar mais de um valor e não armazenar o estado da classe.

Usando parâmetros de saída (output), você pode retornar mais de um valor de uma função.

O parâmetro out preenche esses requisitos. Usando out podemos passar parâmetros cujas alterações são realizadas em seus métodos de chamada. O parâmetro out significa um parâmetro de referência.

Assim, os parâmetros de saída são semelhantes aos parâmetros de referência, exceto pelo fato de que eles transferem dados para fora do método.

O exemplo abaixo mostra um exemplo básico sobre a utilização do parâmetro out :

    class Program
    {
        static void Main(string[] args)
        {
            int n;
            MetodoA(out n);
            // valor é agora igual a 44
            Console.WriteLine("O valor de n é igual a = " + n);     
            Console.ReadLine();
        }
        static void MetodoA(out int i)
        {
            i = 44;
        }
    }

A palavra-chave out força os argumentos a serem passados por referência.  

Esse comportamento é idêntico ao da palavra-chave ref, exceto que ref requer que a variável seja inicializada antes de ser passada.   

Para usar um parâmetro com out, a definição do método e a chamada do método devem explicitamente usar a palavra-chave out.

Embora as variáveis passadas como argumentos out não precisem ser inicializadas antes de serem passadas, o método chamado deve atribuir um valor antes de o método retornar.

Neste exemplo vemos que o método MetodoA() usa o parâmetro out para passar o valor da variável i, atribuído no método, para fora do método.

Vejamos outro exemplo:

    class Program
    {
        public static void getValor(out int x)
        {
            int temp = 555;
            x = temp;
        }
        static void Main(string[] args)
        {
            /* definição da variável local */
            int a = 100;
            Console.WriteLine("Antes da chamada do método:  valor de a : {0}", a);
            /* chamando a função para obter o valor */
            getValor(out a);
            Console.WriteLine("Depois da chamada do método, valor de a : {0}", a);
            Console.ReadLine();
        }
    }
 

Neste código temos que variável fornecida para o parâmetro de saída não necessita ter um valor atribuído.

Os parâmetros de saída são particularmente úteis quando você precisa retornar valores de um método através dos parâmetros sem atribuir um valor inicial para o parâmetro.

Este exemplo mostra como os valores atribuídos no método usando o parâmetro out são repassados para fora do método:

    class Program
    {
        public static void getValores(out int x, out int y)
        {
            Console.WriteLine("Informe o primeiro valor : ");
            x = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Informe o segundo valor  : ");
            y = Convert.ToInt32(Console.ReadLine());
        }
        static void Main(string[] args)
        {
            /* definição da variável local */
            int a, b;
            /* chamando a função para obter o valor */
            getValores(out a, out b);
            Console.WriteLine("Depois da chamada do método, valor de a : {0}", a);
            Console.WriteLine("Depois da chamada do método, valor de b : {0}", b);
            Console.ReadLine();
        }
    }

Declarar um método out é útil quando você deseja que um método retorne vários valores.  

O exemplo a seguir usa out para retornar três variáveis com uma única chamada de método.  

Observe que ao terceiro argumento é atribuído o valor null.  Isso permite que os métodos retornem valores opcionais.  

    class Program
    {
        static void MetodoA(out int i, out string s1, out string n1)
        {
            i = 999;
            s1 = "Macoratti .net";
            n1 = null;
        }
        static void Main(string[] args)
        {
            int valor;
            string str1, str2;
            MetodoA(out valor, out str1, out str2);
            Console.WriteLine("Valores retornados : {0} , {1}, {2} ", valor, str1, str2);
            Console.ReadLine();
        }
    }

E estamos conversados...

Pegue o projeto aqui : ParametrosOutuput.zip

E disse-lhe Jesus: Eu vim a este mundo para juízo, a fim de que os que não vêem vejam, e os que vêem sejam cegos.
João 9:39

Referências:


José Carlos Macoratti