segunda-feira, 2 de outubro de 2017

Novidades do C# 7: Out variables

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:
1
2
3
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:
1
2
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:
1
2
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:
1
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.

Nenhum comentário:

Postar um comentário