C#  - Parâmetro out : declaração in-line e tipo implícito

Hoje veremos o parâmetro out, apresentando alguns novos recursos que foram introduzidos na linguagem C# a partir da versão 7.0.

O parâmetro out é usado quando um método retorna mais de um valor. Quando um parâmetro passa com a palavra-chave ou parâmetro out no método, esse método funciona com o mesmo valor de variável que é passado na chamada do método. Se o valor da variável muda, o valor do parâmetro do método também muda.

Assim, 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.

Existem alguns recursos adicionais do parâmetro out :

Vamos focar nos recursos adicionais mostrando exemplo de utilização. Para isso usamos uma aplicação Console do tipo .NET Core usando o ambiente do .NET Core SDK 5.0.

Declaração in-line do parâmetro out

Antes do C# 7.0 precisávamos
separar a declaração e a inicialização da variável out em duas instruções diferentes.

A partir do C# 7.0 o parâmetro out pode ser passado sem sua declaração e inicialização. Vamos ver um exemplo.



Executando o projeto e informando um valor para o raio teremos o seguinte resultado:



No código que usamos podemos destacar os seguintes recursos do parâmetro out :

Tipo implícito de parâmetro out

Conforme mostrado no exemplo, o parâmetro out é declarado com a especificação do tipo na lista de parâmetros para maior clareza.

No entanto, o C# suporta o uso de uma variável local tipada implicitamente. O tipo de dados de uma variável var será determinado ao atribuir um valor à variável. Depois de atribuir o valor da variável, a variável tem um tipo de dados definido e não pode ser substituída.

Como a variável de tipo var tem escopo local (significa escopo no corpo do método), da mesma forma, o parâmetro out in-line tem escopo no corpo do método, é por isso que o tipo var também pode ser usado como parâmetro out.

Vamos criar um exemplo para encontrar o comprimento do subarray mais longo que contém números que podem ser organizados em uma sequência contínua a partir de um array de inteiros.

using static System.Console;
namespace ParamOut1
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = { 1, 56, 58, 57, 90, 92, 94, 93, 91, 45 };
            int n = arr.Length;

            EncontrarTamanho(arr, n, out var maisLongo);

            WriteLine($"Tamanho do subarray mais longo =  {maisLongo}");
            ReadKey();
        }
        static void EncontrarTamanho(int[] arr, int n, out int maisLongo)
        {
            maisLongo = 1;
            for (int i = 0; i < n - 1; i++)
            {
                int mn = arr[i], mx = arr[i];
                for (int j = i + 1; j < n; j++)
                {
                    mn = Minimo(mn, arr[j]);
                    mx = Maximo(mx, arr[j]);
                    if ((mx - mn) == j - i)
                    {
                        maisLongo = Maximo(maisLongo, mx - mn + 1);
                    }
                }
            }
        }
        static int Minimo(int x, int y)
        {
            return (x < y) ? x : y;
        }
        static int Maximo(int x, int y)
        {
            return (x > y) ? x : y;
        }
    }
}

Neste código estamos usando um parâmetro out com um tipo implícito usando var.

E estamos conversados...

"Porque Deus não nos destinou para a ira, mas para a aquisição da salvação, por nosso Senhor Jesus Cristo,
Que morreu por nós, para que, quer vigiemos, quer durmamos, vivamos juntamente com ele."
1 Tessalonicenses 5:9,10

Referências:


José Carlos Macoratti