C# 8.x -  Introduzindo Records


Existe uma previsão para a implementação na versão 8.x do C# do recurso Records que irei apresentar neste artigo.

Você pode conferir no repositório oficial no Github a proposta de inclusão do tipo Records na linguagem C# :https://github.com/dotnet/csharplang/blob/master/proposals/records.md

Esta proposta refere-se a uma nova maneira de criar uma classe C# do tipo Record que seria uma classe leve com uma coleção de campos com o objetivo de criar rapidamente objetos do tipo POCO e também resolver o problema da comparação de igualdade entre objetos.

Todo o programador C# já precisou criar DTOs (Data Transfer Objects) para armazenar e transmitir dados, que na maioria das vezes contém apenas propriedades e campos somente leitura. Se você é um deles já sabe o trabalho e o tédio que é criar DTOs.

Pois bem, é aqui que o recurso Records, previsto para o C# 8.x, chega para simplificar o processo de criação destas classes.

A sintaxe usada no recurso Records permite que o compilador faça todo o trabalho e produza o código desejado apenas informando o tipo da classe que queremos gerar.

A título de exemplo , o código abaixo, segundo a implementação do tipo Record;

 

    public class Pessoa(string Nome, string Email, string Endereco, DateTime Nascimento);

 

Iria gerar o código da classe seguinte que também implementa IEquatable:

using System;

    class Pessoa : IEquatable<Pessoa>
    {
        public string Nome { get; }
        public string Email { get; }
        public string Endereco { get; }
        public DateTime Nascimento { get; }

        public Pessoa(string Nome, string Email, string Endereco, DateTime Nascimento)
        {
            this.Nome = Nome;
            this.Email = Email;
            this.Endereco = Endereco;
            this.Nascimento = Nascimento;
        }

        public bool Equals(Pessoa other)
        {
            return Equals(Nome, other.Nome) && Equals(Email, other.Email)
&& Equals(Endereco, other.Endereco) && Equals(Nascimento, other.Nascimento);
        }

        public override bool Equals(object other)
        {
            return (other as Pessoa)?.Equals(this) == true;
        }

        public override int GetHashCode()
        {
            return (Nome.GetHashCode() * 17 + Email.GetHashCode() + Endereco.GetHashCode() + Nascimento.GetHashCode());
        }

        public void Deconstruct(out string Nome, out string Email, out string Endereco, out DateTime Nascimento)
        {
            Nome = this.Nome;
            Email = this.Email;
            Endereco = this.Endereco;
            Nascimento = this.Nascimento;
        }

        public Pessoa With(string Nome = this.Nome, string Email = this.Email, string Endereco = this.Endereco, DateTime Nascimento = this.Nascimento) => new Person(Nome, Email, Endereco, Nascimento);
    }
 

Como você pode ver, as propriedades do Record são somente de leitura e só podem ser inicializadas a partir de um construtor. Além disso, vemos o uso da igualdade de valor e do método GetHashCode para uso em coleções baseadas em hash, como Dictionary e HashTable.

Podemos ver também que o método Desconstruct também é implementado, para que possamos desconstruir uma instância dessa classe com uma sintaxe muito semelhante ao ValueTuple.

A última coisa que vemos na classe gerada é o método With. Esta também é uma nova introdução ao C#. Para as classes imutáveis e mutáveis, a expressão with pode produzir uma nova instância com um ou mais valores alterados.

Lembrando que isso por enquanto é uma proposta para as versões do 8.x do C#.

Então vamos aguardar a chegada do recurso.

Referências:


José Carlos Macoratti