csharp7-localfunctions-00

Neste terceiro post da série sobre novidades do C# 7 serão apresentadas as Local Functions.

Se tiver interesse em saber mais sobre as postagens anteriores consulte os links:

http://netcoders.com.br/csharp-7-pattern-matching/

http://netcoders.com.br/csharp7-binary-literals-digit-separators/

http://netcoders.com.br/csharp7-ref-returns/

Configurando o uso do C# 7 no Visual Studio “15”

Para os exemplos descritos neste artigo foram criados dois projetos a partir do template “Console Application” do Preview 2 do Visual Studio “15”, com os mesmos utilizando a versão 4.6.1 do .NET Framework.

O download do novo Visual Studio pode ser realizado por meio do seguinte link:

https://www.visualstudio.com/en-us/news/releasenotes/vs15/vs15-relnotes

Para configurar o uso do C# 7 acesse a seção “Build”, dentro das propriedades do projeto. No campo “Conditional compilation symbols” (Imagem 1) inclua o valor __DEMO__.

csharp7-localfunctions-01
Imagem 1. Configurando um projeto para uso do C# 7

Local Functions

O C# 7 agora também permite a declaração de funções dentro de métodos convencionais, algo antes possível apenas no corpo de uma classe. Do ponto de vista prático, este recurso batizado como Local Functions permitirá que se isolem métodos que teriam a princípio uma abrangência de uso bem restrita (normalmente sendo invocados por uma única operação).

Na Listagem 1 é possível observar um exemplo envolvendo uma Local Function chamada ExibirHorarioAtual:

using System;
using System.Threading;

namespace TesteLocalFunctions01
{
    class Program
    {
        static void Main(string[] args)
        {
            void ExibirHorarioAtual()
            {
                Console.WriteLine(
                    $"Horário atual: {DateTime.Now.ToString("HH:mm:ss")}");

            }

            ExibirHorarioAtual();

            Console.WriteLine("Aguarde alguns segundos...");
            Random r = new Random();
            Thread.Sleep(new Random().Next(3000, 6000));

            ExibirHorarioAtual();
            Console.ReadKey();
        }
    }
}

Listagem 1: Exemplo de utilização de uma Local Function

O resultado da execução desta sequência de instruções pode ser observado na Imagem 2:

csharp7-localfunctions-02
Imagem 2. Exemplo de utilização de uma Local Function

Na Listagem 2 está um segundo exemplo de uso de uma Local Function, com o método Inverter revertendo a ordem dos caracteres que compõem uma string:

using System;
using System.Linq;

namespace TesteLocalFunctions02
{
    class Program
    {
        static void Main(string[] args)
        {
            string Inverter(string valor)
            {
                return new string(
                    valor.ToCharArray().Reverse().ToArray());
            }

            string texto;

            texto = "Utilizando o C# 7";
            Console.WriteLine($"{texto} -> {Inverter(texto)}");

            texto = "Local Function";
            Console.WriteLine($"{texto} -> {Inverter(texto)}");

            Console.ReadKey();
        }
    }
}

Listagem 2: Outro exemplo de utilização de uma Local Function

A Imagem 3 traz o resultado da execução deste bloco de código:

csharp7-localfunctions-03
Imagem 3. Outro exemplo de uso de uma Local Function

A função Inverter também poderia ser declarada empregando uma expressão lambda, representando assim um exemplo de Expression-bodied Function. É o que demonstra a Listagem 3:

using System;
using System.Linq;

namespace TesteLocalFunctions02
{
    class Program
    {
        static void Main(string[] args)
        {
            string Inverter(string valor) =>
                new string(valor.ToCharArray().Reverse().ToArray());

            string texto;

            texto = "Utilizando o C# 7";
            Console.WriteLine($"{texto} -> {Inverter(texto)}");

            texto = "Local Function";
            Console.WriteLine($"{texto} -> {Inverter(texto)}");

            Console.ReadKey();
        }
    }
}

Listagem 3: Local Function baseada em uma expressão lambda

Conclusão

Uma Local Function tende a ser interessante em cenários nos quais o uso de um método estaria restrito a uma operação específica. Além da sintaxe convencional, este novo recurso do C# 7 pode ser declarado através da utilização de expressões lambdas.

Espero que este conteúdo possa ter sido útil.

Até uma próxima oportunidade!

Referências

The Future of C# – Build 2016
https://channel9.msdn.com/Events/Build/2016/B889

Renato Groffe

Atua como consultor em atividades voltadas ao desenvolvimento de softwares há mais de 13 anos. Bacharel em Sistemas de Informação, com especialização em Engenharia de Software. Microsoft Certified Technology Specialist (Web, WCF, Distributed Applications, ADO.NET, Windows Forms), Microsoft Specialist (HTML5 with JavaScript and CSS3, Developing ASP.NET MVC 4 Web Applications), Oracle Certified Associate (PL/SQL), Sun Certified (SCJP, SCWCD), ITIL Foundation V2, Cobit 4.1 Foundation.

Facebook Google+ 

Comentários

comentarios