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 o C# 7.0 esta capacidade foi estendida também para o retorno de métodos, sendo que este recurso foi batizado como Ref Returns.
Na próxima listagem, é 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.
namespace ExemploRefReturns
{
public class ClasseExemplo
{
private int _contador = 0;
public void Incrementar()
{
_contador++;
}
public int ObterValorContador()
{
return _contador;
}
public ref int ObterContador()
{
return ref _contador;
}
}
}
Já na listagem a seguir 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.
using System;
namespace ExemploRefReturns
{
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();
}
}
}
O resultado da execução deste último trecho de código pode ser observado na seguinte imagem:
Do ponto de vista prático, a utilização de Ref Internals 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 em termos de memória consumida constitui um fator crítico (em situações similares àquelas envolvendo o uso de ponteiros em C++).
Referências
- New Features in C# 7.0: https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/




