Neste terceiro post da série sobre novidades do C# 7 será apresentado em detalhes um recurso chamado Ref Returns.
Caso queira acompanhar as postagens anteriores consulte os links:
Novidades do C# 7 — Pattern Matching
Novidades do C# 7 — Binary Literals e Digit Separators
Configurando o uso do C# 7 no Visual Studio “15”
Para o exemplo descrito neste artigo foi utilizado um projeto baseado no template “Console Application” do Preview 2 do Visual Studio “15”, além da 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 acessar a seção “Build”, dentro das propriedades do projeto. No campo “Conditional compilation symbols” (Imagem 1) incluir o valor __DEMO__.
Imagem 1. Configurando um projeto para uso do C# 7
Ref Returns
Em releases anteriores do C# a utilização da palavra-chave ref se resumia à passagem de parâmetros por referência na invocação de métodos. Com a versão 7 esta capacidade foi estendida também para o retorno de métodos, sendo que este recurso foi batizado como Ref Returns.
Na Listagem 1 é possível observar um exemplo de uso de Ref Returns. A declaração do método ObterContador e o seu retorno foram marcados com a palavra-chave ref, indicando que o atributo privado _contador será devolvido como referência.
[code language=”csharp” highlight=”17,19"]
namespace TesteRefReturns
{
public class ClasseExemplo
{
private int _contador = 0;
public void Incrementar()
{
_contador++;
}
public int ObterValorContador()
{
return _contador;
}
public ref int ObterContador()
{
return ref _contador;
}
}
}
[/code]
Listagem 1: Ref Returns
Já na Listagem 2 o método ObterContador é invocado, com o retorno do mesmo sendo vinculado à variável teste:
- Importante destacar que em ambos os casos foi necessário utilizar a palavra-chave ref;
- Alterações em teste serão refletidas em ClasseExemplo, já que tal variável nada mais é do que uma referência apontando para o atributo privado _contador.
[code language=”csharp” highlight=”13"]
using System;
namespace TesteRefReturns
{
class Program
{
static void Main(string[] args)
{
ClasseExemplo exemplo = new ClasseExemplo();
exemplo.Incrementar();
Console.WriteLine(exemplo.ObterValorContador());
ref int teste = ref exemplo.ObterContador();
teste++;
Console.WriteLine(exemplo.ObterValorContador());
Console.ReadKey();
}
}
}
[/code]
Listagem 2: Utilizando Ref Returns
O resultado da execução deste último trecho de código pode ser observado na Imagem 2:
Imagem 2. Exemplo de utilização de Ref Returns
Conclusão
Do ponto de vista prático, a utilização de Ref Returns tende a não acontecer com tanta frequência. Espera-se que a adoção deste recurso fique restrita a cenários bem específicos, nas quais a performance na manipulação da memória consumida constitui um fator crítico (em situações similares àquelas envolvendo o uso de ponteiros em C++).
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