Novidades do C# 7 — Ref Returns

NetCoders
netcoders
Published in
3 min readMay 30, 2016
csharp7-ref-returns

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__.

csharp7-ref-internals-01

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:

csharp7-ref-internals-02

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

--

--