skip to Main Content

Record C#/.NET: O que é e como utilizá-lo

Record-C#-Lyncas

Apesar de ser uma estrutura relativamente nova no C#, o Record pode nos ajudar em diversas situações. Características como a comparação de valores, imutabilidade e uma sintaxe simples fazem com que o record seja indispensável.

Neste artigo iremos analisar o que é um record C# e como ele pode ser utilizado. Acompanhe!

 

Entenda a linguagem de programação C#

Lançado há mais de 20 anos, o C# é uma linguagem de programação orientada a objetos e fortemente tipada, sendo amplamente utilizada em diversos tipos de aplicações. O C# se destaca por ser moderno e continuar recebendo atualizações constantes. Em uma de suas últimas versões, mais especificamente no lançamento do C# 9, em novembro de 2020, o conceito de Record foi adicionado a linguagem.

Veja também: Typescript: aprenda sobre criação de tipos com essa linguagem 

 

O que é Record C#

Record é uma estrutura de dados do tipo referência, ou seja, que armazena uma referência para as informações que ficam na memória heap. Record class é um sinônimo de record. Utilizando essas palavras-chaves, o objeto criado é uma classe que implementa a interface IEquatable.

Mas, essa não é a única maneira de utilizar o Record, também podemos criar um Record struct, que é um objeto do tipo valor, uma struct que também implementa a interface IEquatable. Quando utilizado dessa maneira, o objeto criado não é imutável por padrão, mas podemos utilizar o readonly record struct para criar objetos imutáveis.

 

Confira as características do Record na linguagem C#

Sintaxe posicional

Apesar de records serem mutáveis, eles foram pensados para serem utilizados como estruturas de dados imutáveis. Nesse sentido, a primeira característica que chama a atenção sobre os records é a sintaxe posicional para definição de propriedades, na qual podemos criar um record imutável de maneira simples:

Record-C#-Lyncas

 

Comportamento interno

Nesse caso, o record está se comportando como um tipo de referência, isso ocorre pois, como vimos, o record é uma classe que implementa a interface IEquatable. Podemos verificar isso no sharplab ao criarmos o record da imagem anterior:

 

Ao utilizarmos a sintaxe posicional para os tipos record, record class e readonly record struct, as propriedades serão do tipo init only, mantendo a imutabilidade. Mas, no caso do record struct, as propriedades não são imutáveis.

Na implementação do record struct, podemos notar o funcionamento interno que também implementa a interface IEquatable.

Comparação de valores

Sendo assim, a maneira com que os records comparam objetos é igual, não importando se utilizamos record class ou record struct.

Para records, dois objetos são iguais se eles forem do mesmo tipo e tiverem os mesmos valores em todas as propriedades.

 

Herança

O tipo record class pode herdar de outro record class, porém um record não pode herdar uma classe e uma classe não pode herdar de um record.

Como vimos anteriormente, a comparação de igualdade para objetos record leva em conta o tipo do objeto. No exemplo abaixo, mesmo com variáveis do mesmo tipo Pessoa, os objetos são de tipos diferentes, retornando false. No segundo exemplo, mesmo tendo uma variável do tipo Pessoa e outra do tipo Estudante, os dois objetos são do tipo estudante, fazendo com que o retorno seja true.

 

Mutação não destrutiva

Em alguns casos, pode ser necessário copiar um record C#, porém alterando informações. Para esses casos, existe o conceito de mutação não destrutiva, onde iremos utilizar a palavra with para definir os campos que serão alterados.

No exemplo acima, copiamos a propriedade Nome e alteramos a propriedade Idade.

Formatação para exibição

Records possuem um método ToString específico, que retorna o tipo, o nome de todas as propriedades públicas e seu valor. Usando o exemplo da imagem acima para retornar pessoa2, teremos o seguinte resultado:

 

Record C# é uma poderosa ferramenta para desenvolvedores

Como você pode ver, o Record C# é uma ótima ferramenta, pois permite que desenvolvedores definam novos tipos de estruturas de dados.

São ideais para cenários onde a imutabilidade é importante, como em DTOs e objetos de valor imutável. Além disso, proporciona flexibilidade, permitindo que trabalhemos tanto com classes como structs.

Mas, como toda ferramenta, é importante entender seus benefícios e suas limitações para utilizá-la da maneira correta. 

Na próxima vez que você criar um tipo de objeto, pense nas suas utilizações e considere usar um Record C#!

Quer saber mais sobre linguagens de programação? Confira as novidades da nova versão Java 17!