Back-End

10 out, 2017

C# 7.0: Ref Returns

Publicidade

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