Esse é o 5º post da série sobre C# 7. Pra acompanhar a série você pode seguir a tag C#7 no blog ou voltar no post que agrega a série.

Estou retomando a série de C# 7, e nesse momento os novos compiladores já saíram, assim como o Visual Studio 2017. Então, a partir de agora, vou linkar direto para os docs das funcionalidades, em vez do Github.

Out variables

A ideia é que você possa, em uma única linha, declarar a variável e já lhe atribuir um valor, ao chamar um método que possui uma variável out.

Isso é muito utilizado em métodos do tipo Try. Até o C# 6, você tinha que fazer assim:

int result;
if (int.TryParse("1", out result))
    WriteLine(result);

E agora com C# 7 você pode declarar a variável na mesma linha do TryParse:

if (int.TryParse("1", out int result))
    WriteLine(result);

E pode também usar a poderosa inferência de tipos do C# e evitar escrever o tipo, no caso int, aqui. Nesse caso, não há uma grande vantagem ao mudar de int pra var, mas a variável de saída poderia ser um tipo mais complexo e chato de digitar, como um IEnumerable<Person<int>> por exemplo. Veja com fica com a inferência do tipo:

if (int.TryParse("1", out var result2))
    WriteLine(result2);

Escopo

Note que chamei a variável de result2 em vez de result. Isso porque o escopo da variável declarada é o mesmo da expressão em que ela está inserida, ou seja, ela “vaza” para o escopo do if, e, já tendo sido declarada uma variável result antes, a seguinte deve ter outro nome. Inicialmente o escopo seria restrito ao if, mas isso foi alterado ao longo do caminho.

Variáveis de saída são especialmente interessantes quando falamos de expression bodied members (que temos desde o C# 6). Veja como fica bonito um método que combina out variables com um operador ternário, em uma construção impossível na versão anterior:

public int? GetValue() => int.TryParse(this.value, out var result) ? (int?)result : null;

É isso, bem simples, mas bastante útil, deixando nosso código bem mais simples e bonito de ler. Já está disponível, então, divirta-se!

Você consegue ler sobre out variables na seção de novidades do C# 7 no Microsoft Docs.

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.