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.