• Novidades do C# 7 - Local Functions

    05 de maio de 2017

Nessa série de artigos vamos explorar as novidades introduzidas na versão 7 da linguagem C#. Lançada no último mês de março junto com o Visual Studio 2017, no qual a nova linguagem pode ser utilizada, também podendo ser testada com o Xamarin Workbooks tanto em Windows como em macOS, método que escolhi para escrever os testes desses artigos.

Nessa terceira parte vamos conhecer o novo recurso chamado de Local Functions ou Funções locais. Trata-se da possibilidade de declarar uma função dentro de um método, privilegiando a organização do código.

Tomemos como exemplo um método que determina se um número é primo. Ele poderia ser escrito da seguinte forma:

Essa é apenas uma entre as diversas formas de se escrever um algoritmo para verificar números primos.

Note que o método é dividido em algumas pequenas verificações. Usando funções locais poderíamos re-escreve-lo de seguinte forma:

Nesse caso nós isolamos a parte que determina se o número é par em uma função local (IsEven). A alteração é simples mas note como o código acaba ficando mais legível já que a chamada da função acaba por descrever a condição que esta sendo verificada ali.

Funções locais podem ser declaradas em qualquer parte do corpo do método, mas uma convenção que tenho visto é a de se colocar no final. A forma como ela é declara é idêntica a de um método, exceto pela ausência de um modificador de acesso (private, protected, public, etc.) que não faria sentido nesse contexto já que a função só é visível dentro do corpo do método.

Uma outra características das funções locais é que elas automaticamente capturam os parâmetros e variáveis no corpo do método. Então poderíamos simplificar ainda mais o código:

Aplicações Úteis

Mais do que uma forma de organizar o código de um método, as funções locais visam facilitar dois cenários comuns.

Iterator Methods

Métodos de iteração são aqueles que retornam um IEnumerable ou IEnumerable<T>, uma sequência de elementos. O C# tem desde seus primórdios a instrução yield que facilita a construção de sequências computadas, assim poderíamos tirar proveito da função que criamos anteriormente para listar os números primos dentro de um determinado intervalo. Considere o método abaixo:

Um problema com essa implementação é que caso sejam passados argumentos inválidos para ela, a exception só será disparada quando a enumeração for acessada. Por exemplo:

A primeira linha não irá gerar uma Exception, apenas quando entrarmos no loop é que ela será disparada. Isso acontece porque o C# considera um método que utilize a instrução yield return como um Iterator Method, e dessa forma sua execução é postergada até o momento em que tentamos enumerar os elementos da sequência (enumerable) que ele retorna. Esse é o tipo de falha que pode ser complicada de diagnosticar em bases de código muito extensas.

Embora seja possível re-escrever esse código para isolar a parte que contém a instrução yield return, usando funções locais a leitura desse método ficará mais simples e organizada, e resolverá o problema:

O função local Enumerate é responsável por produzir a enumeração e dessa forma a passagem inválida de parâmetros irá disparar uma exception assim que for executada.

Métodos Assíncronos

O mesmo raciocínio que exploramos anteriormente se aplica a métodos assíncronos. É comum que seja necessário fazer algum tipo de validação antes de iniciar o processamento assíncrono, seja por validação, seja pelo uso de algum mecanismo de cache. Tomemos o exemplo:

O método GetStringAsync recebe uma URL e faz o download do seu conteúdo retornando um texto. No exemplo representamos um Cache como um dicionário. Primeiro verificamos se há algum cache para aquela URL, nesse caso retornamos imediatamente. Caso não exista um cache então verificamos se a URL passada é válida (note o uso da out variable do C# 7).

A porção assíncrona da execução desse método só é executada de fato se as condições anteriores não forem satisfeitas. Isso economiza memória e processamento envolvidos em códigos assíncronos.

Conclusão

Funções locais são um acréscimo desejável que facilita a organização de métodos complexos e também de alguns cenários comuns de programação. Experimente e compartilhe nos comentários suas experiências com esse novo recurso!

Não deixe de conferir os outros artigos dessa série para saber mais sobre os recursos do C# 7:

Share

Desenvolvedor de aplicações, administrador de bancos de dados e gerente de projetos em uma ampla variedade de aplicativos de negócios, utilizando modernas metodologias e ferramentas de ALM e processos Agile. Me considero um entusiasta em tecnologia, com mais de 10 anos de experiência nesse mercado. Atualmente voltado para o mercado mobile, me especializei no desenvolvimento de aplicações para as principais plataformas do mercado (Android, iOS e Windows Phone), e em organizar e ministrar de treinamentos para desenvolvedores.

Leia também

Novidades do C# 7 – Out Variables
C#
27 de abril de 2017

Novidades do C# 7 – Out Variables

Nessa série de artigos vamos explorar as novidades introduzidas na versão 7 da linguagem C#. Lançada no último mês de março junto com o Visual Studio 2017, no qual a nova linguagem pode ser utilizada, também podendo ser testada com o Xamarin Workbooks tanto em Windows como em macOS, método que escolhi para escrever os […]

LEIA MAIS
Novidades do C# 7 – Tuplas
C#
26 de abril de 2017

Novidades do C# 7 – Tuplas

Nessa série de artigos vamos explorar as novidades introduzidas na versão 7 da linguagem C#. Lançada no último mês de março junto com o Visual Studio 2017, no qual a nova linguagem pode ser utilizada, também podendo ser testada com o Xamarin Workbooks tanto em Windows como em macOS, método que escolhi para escrever os […]

LEIA MAIS
Primeiras Impressões do Visual Studio 2017
Visual Studio
07 de abril de 2017

Primeiras Impressões do Visual Studio 2017

O Visual Studio 2017 foi enfim lançado no último dia 7 de março, em um evento de dois dias transmitido ao vivo, com um Keynote bastante interessante e algumas dezenas de sessões técnicas, disponíveis no Channel 9. Pouco menos de um mês depois de seu lançamento, tenho usado a nova versão quase diariamente e vou […]

LEIA MAIS

Comentários