C# -  Sete fatos sobre o tipo record


 Neste artigo vamos recordar os alguns recursos do tipo record.

A partir do  C# 9, podemos definir um tipo de referência que fornece a funcionalidade de encapsular dados usando a palavra-chave record.

Dessa forma, agora podemos definir tipos de dados usando uma classe uma struct e um record.

Os records são distintos das classes pois os tipos records usam igualdade baseada em valor, assim duas variáveis de um tipo record são iguais se as definições do tipo record forem idênticas e, se para cada campo, os valores em ambos os records forem iguais.

Duas variáveis de um tipo classe são iguais se os objetos referenciados forem do mesmo tipo da classe e as variáveis se referirem ao mesmo objeto.

Para impor a semântica de valor, o compilador gera vários métodos para seu tipo record, como : 

- Uma substituição de Object.Equals(Object);
- Um método Equals virtual cujo parâmetro é o tipo record;
- Uma substituição de Object.GetHashCode();
- Métodos para operador == e operador !=;
- Os tipos record implementam System.IEquatable<T>;

Vejamos a seguir sete fatos sobre o recurso record.

1- Records são imutáveis

Por padrão, os records são imutáveis. Isso significa que, depois de criar uma instância, você não pode modificar nenhum de seus campos:



2- Records implementam equality

A outra propriedade principal dos registros é que eles implementam a igualdade pronta para uso.

Criamos duas instâncias de Pessoa com os mesmos campos.

Elas são consideradas iguais mas não são a mesma instância:

3- Records podem ser clonados ou atualizados usando a palavra-chave with

Podemos atualizar um campo de um record usando a palavra-chave with:

no código :  maria1 with {Id = 2 };  criamos um clone de maria1 e atualizamos o campo Id.

Além disso podemos usar with para criar uma nova instância igual a original:

 

Resultado dos testes:

4- Records podem ser classes e structs

A partir do C# 10 um record pode se comportar como uma classe ou struct :

Assim , opcionalmente, podemos declarar um record class para esclarecer que é um tipo de referência ou ainda
definir uma record struct para criar um registro que seja um tipo de valor.

Tudo o que foi visto nos itens anteriores é válido para esses tipos.

5- Records podem possuir subtipos

Um recurso interessante dos records é que podemos criar uma hierarquia de records de uma maneira muito simples.

Podemos usar a definição do record Pessoa e criar um subtipo Aluno :

6- Records podem ser abstratos

Podemos criar um record abstrato usando a palavra-chave abstract :

public abstract record Caixa(int Volume, string Material);

Assim, isso significa que não podemos instanciar novos records tipo esteja marcado como abstrato.

Precisamos criar um tipo concreto - CaixaVidro - para criar implementar uma Caixa:

7- Records podem ser selados

Podemos marcar um record como Sealed.

Isso significa que não podemos agora criar subtipos deste record.

Em última análise, ao considerar a utilização do recurso record em seus projetos, vale a pena explorar suas nuances e entender como eles podem simplificar e fortalecer sua base de código. Com a sua capacidade de encapsular dados de forma estruturada e eficiente, os records representam mais do que apenas uma nova sintaxe - eles representam um um novo recurso na evolução da linguagem de programação C#.

E estamos conversados...

"Porque nele(Jesus) foram criadas todas as coisas que há nos céus e na terra, visíveis e invisíveis, sejam tronos, sejam dominações, sejam principados, sejam potestades. Tudo foi criado por ele e para ele."
Colossenses 1:16

Referências:


José Carlos Macoratti