Uma nova feature do C# 9: tipos “Record”.

Marcio Nizzola
4 min readAug 22, 2021

--

o tipo Record uma novidade do C# 9

Um dos recursos novos disponibilizados com a versão do C# 9 é o tipo Record.

Este tipo cumpre com algumas funções úteis — é um tipo de referência, mas possui um item que ajudará muitos desenvolvedores, que é a comparação de igualdade entre dois “record”, quando seus campos forem considerados iguais. Além disso, possui uma forma simples e fácil de definir suas propriedades em comparação com uma classe completa.

Como isto é algo novo, muitas pessoas não sabem como e onde utilizá-la, então neste artigo vou exemplificar como podemos realizar uma implementação simples e assim auxiliar para que em seus novos códigos possam fazer uso deste novo elemento.

Como era antes dele

Até outro dia, uma implementação de um objeto era a forma mais simples de criar algo similar ao que faremos com um Record. Normalmente criamos classes pequenas, que não tem responsabilidades além de realizar o armazenamento de dados da maneira mais simples possível.

Veja nosso exemplo:

declaração de um objeto a partir de uma classe em C#

Simples, mas mesmo assim dá algum trabalho criar uma classe somente para conter uma informação muitas vezes armazenada de forma temporária em memória.

Uma implementação de um Record

Agora vamos realizar a mesma coisa utilizando “Record” !

implementação do tipo Record em C#

Muito bom não é? parece até mentira ! Observe que verificar a igualdade deste objeto é possível agora.

comparação entre dois records com C#

Sendo assim, o resultado é demonstrado ao rodar a aplicação console, ou seja, temos uma comparação entre dois record´s.

Ainda podemos estender o record com propriedades adicionais (que serão opcionais, pois não aparecem no construtor a menos que você defina um personalizado) ou outros métodos no corpo do “record”, para que possa estender ainda mais. Além disso, um “record” pode fazer uso de herança, como uma classe regular.

Outra característica: A Imutabilidade

Imutabilidade é um conceito com o qual cada vez mais pessoas gostam de trabalhar, pois torna o comportamento de muitos códigos muito mais previsível e confiável. A imutabilidade em termos de objeto visa principalmente tornar um objeto em si incapaz de mudar — Quando você deseja que seu objeto mude, você simplesmente cria um novo. Isso também ajuda tremendamente com questões referenciais. Se você precisar mudar algo, você obtém uma nova referência e pode facilmente compará-la.

Os tipos de registro (record) oferecem suporte a um padrão de codificação imutável naturalmente. Existem vários conceitos que mostram isso claramente:

As propriedades geradas pelo compilador em um tipo “record (as propriedades que você declara dentro das chaves do registro ) são apenas init por padrão. Isso significa que eles podem ser atribuídos durante a criação do objeto, mas não podem ser reatribuídos posteriormente. O código a seguir é, portanto, inválido:

A palavra chave “with”

Um outro recurso interessante é o uso da palavra “with”, com ela podemos criar um novo “record”, utilizando-se dados de outro “record”, criando um novo objeto.

Este tipo de operação se fosse feito com uma classe normal, exigiria muito mais código, seria necessário implementar o código para fazer um clone do objeto, só então definir as propriedades, tomando o cuidado de não passar nada por referência. Aqui fazemos com uma linha só de código !!

Exibição

Outro ponto interessante, é que se fizermos um comando Console.Write com uma classe, nossa resposta será assim:

ao exibir uma classe, seu retorno é o “tipo de objeto”

Mas se fizermos com o nosso objeto do tipo “record” teremos a resposta assim, ou seja, ele vai exibir já no formato JSON.

ao exibir um tipo “record” seus valores são exibidos como um Json

Referências

https://marcionizzola.medium.com/uma-nova-feature-do-c-9-tipos-record-7986c7532be6?WT.mc_id=DX-MVP-5004978

--

--

Marcio Nizzola

Microsoft MVP | Software Architect na CI&T | Prof. da Etec Itu | Membro Fundador da Comunidade Itu Developers.