Novidades do C# 7 — Local Functions

NetCoders
netcoders
Published in
3 min readJun 6, 2016
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:

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:

[code language=”csharp” highlight=”10,11,12,13,14,15"]
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();
}
}
}
[/code]

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:

[code language=”csharp” highlight=”10,11,12,13,14"]
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();
}
}
}
[/code]

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:

[code language=”csharp” highlight=”10,11"]
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();
}
}
}
[/code]

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

--

--